【问题标题】:Nix: Can an installed package set a user environment variable?Nix:已安装的软件包可以设置用户环境变量吗?
【发布时间】:2016-09-26 22:01:19
【问题描述】:

我想通过 Nix 定义我的软件的 rc 文件。因此,我在config.nix 中定义了一个新包,其中包含一个配置文件:

{ pkgs, ... }:
{
packageOverrides = pkgs : with pkgs; {
  custom-config = import ./custom-config {
    inherit (pkgs) stdenv;
  };
};
}

然后在 custom-config/default.nix 文件被内联定义:

{ stdenv }:

stdenv.mkDerivation rec {
  name = "custom-config";
  stdenv.mkDerivation {
    name = "CustomConfig";
    src = builtins.toFile "customrc" ''
      # content
      '';
  };
}

最后缺少的部分是:在用户默认的shell中添加一个特定的环境变量,如CUSTOM_CONFIG_RC,相关程序会使用它。

谁能给我一个提示?我刚刚开始掌握语言。

【问题讨论】:

    标签: nix


    【解决方案1】:

    典型的 Nix 方法是在不修改用户的 shell 的情况下执行此操作,而是使用makeWrapper 来包装使用 RC 文件的程序。这样一来,您的环境就不会被只有一个程序需要的变量所污染。

    buildInputs = [ makeWrapper ];
    
    postInstall = ''
      wrapProgram "$out/bin/my-program" --set CUSTOM_CONFIG_RC "$rcFile"
    '';
    

    不幸的是makeWrapper still isn't documented,但它被广泛使用;我推荐 grepping 为examples in the nixpkgs repo

    (现在记录在案here


    如果您确实希望该变量在您的环境中可用,您的派生可以执行类似的操作

    postInstall = ''
      mkdir -p $out/share
      echo "export CUSTOM_CONFIG_RC=$rcFile" > $out/share/your-rc-setup-script.sh
    '';
    

    安装包后,它将最终从~/.nix-profile/share/your-rc-setup-script.sh 符号链接,然后在您的.bashrc 中,您可以加载它

    source $HOME/.nix-profile/share/your-rc-setup-script.sh
    

    【讨论】:

    • 好的,我明白了。但是使用“makeWrapper”会导致从整个数据包的源重新编译——而我唯一需要的更改是运行时环境变量和添加的文件?第二个提示:是的,像这样……味道不对;-) 希望将所有规格放在一个地方。对吗:“config.nix”不能影响“configuration.nix”中的“环境”变量?
    • 1.您可以将包装的程序作为单独的派生程序,而不是更改包,以避免重新编译的需要。 2.“一个地方”可以是这些脚本的目录,例如~/.nix-profile/share/rc-scripts/... 和您的 .bashrc 可以遍历该目录并将它们全部获取。 3. 我不完全按照,但我认为你说的是​​对的。据我所知,没有直接的机制可以从包中设置你的基础环境,我认为这会与 Nix 哲学相悖。
    • 我想知道,如果您有一个包含多个脚本的 Python 包,并且所有人都希望在调用它时使用一些环境变量,那么在每个脚本上使用 makeWrapper 的预期习惯用法是什么?或者有没有办法一次性打包所有脚本?
    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    相关资源
    最近更新 更多