2016-09-26 24 views
2

我想通过Nix来定义我的软件的rc文件。因此,我定义config.nix一个新的包将包含一个配置文件:在自定义配置Nix:安装的软件包可以设置用户环境变量吗?

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

然后/ default.nix的文件中定义的内联:

{ stdenv }: 

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

最后一部分缺失的是:将特定的环境变量添加到用户默认shell,如CUSTOM_CONFIG_RC,这是相关程序的荣幸。

有人可以给我一个提示吗?我刚刚开始掌握语言。

回答

2

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

buildInputs = [ makeWrapper ]; 

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

不幸的是makeWrapper still isn't documented,但它的广泛使用;我建议grep examples in the nixpkgs repo


如果你真的想在你的环境中使用该变量,你推导可以做类似

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 
+0

好吧,我明白了。但是使用'makeWrapper'会导致从整个数据包的源代码重新编译 - 而我需要的唯一更改是运行时环境变量和添加的文件?第二个提示:是的,有这样的感觉......味道不对;-)希望将所有的规格放在一个地方。是否正确:'config.nix'不能影响'configuration.nix'中的'environment'变量? –

+0

1.不要改变软件包,你可以将包装后的程序作为单独的派生来避免重新编译。 2.“一个地方”可以是这些脚本的目录,例如'〜/ .nix-profile/share/rc-scripts/...'和你的'.bashrc'可以遍历该目录,并将它们全部来源。我并不完全遵循,但我认为你说的是​​对的。就我所知,没有直接的机制来设置您的基础环境,并且我认为这会与Nix哲学相违背。 –