Nix:安装的软件包可以设置用户环境变量吗?

lks*_*djf 6 nix

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

{ pkgs, ... }:
{
packageOverrides = pkgs : with pkgs; {
  custom-config = import ./custom-config {
    inherit (pkgs) stdenv;
  };
};
}
Run Code Online (Sandbox Code Playgroud)

然后在custom-config/default.nix中,文件是内联定义的:

{ stdenv }:

stdenv.mkDerivation rec {
  name = "custom-config";
  stdenv.mkDerivation {
    name = "CustomConfig";
    src = builtins.toFile "customrc" ''
      # content
      '';
  };
}
Run Code Online (Sandbox Code Playgroud)

缺少的最后一部分是:将一个特定的环境变量添加到用户的默认shell,比如CUSTOM_CONFIG_RC相关程序.

任何人都可以给我一个提示吗?我刚刚开始掌握这门语言.

Chr*_*tin 7

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

buildInputs = [ makeWrapper ];

postInstall = ''
  wrapProgram "$out/bin/my-program" --set CUSTOM_CONFIG_RC "$rcFile"
'';
Run Code Online (Sandbox Code Playgroud)

不幸的是,makeWrapper仍未被记录,但它被广泛使用; 我建议在nixpkgs repo中使用grepping作为示例.


如果您确实希望在您的环境中使用该变量,那么您的推导可以做类似的事情

postInstall = ''
  mkdir -p $out/share
  echo "export CUSTOM_CONFIG_RC=$rcFile" > $out/share/your-rc-setup-script.sh
'';
Run Code Online (Sandbox Code Playgroud)

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

source $HOME/.nix-profile/share/your-rc-setup-script.sh
Run Code Online (Sandbox Code Playgroud)