Nix:安装的软件包可以设置用户环境变量吗?
问题描述:
我想通过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
,这是相关程序的荣幸。
有人可以给我一个提示吗?我刚刚开始掌握语言。
答
典型的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
好吧,我明白了。但是使用'makeWrapper'会导致从整个数据包的源代码重新编译 - 而我需要的唯一更改是运行时环境变量和添加的文件?第二个提示:是的,有这样的感觉......味道不对;-)希望将所有的规格放在一个地方。是否正确:'config.nix'不能影响'configuration.nix'中的'environment'变量? –
1.不要改变软件包,你可以将包装后的程序作为单独的派生来避免重新编译。 2.“一个地方”可以是这些脚本的目录,例如'〜/ .nix-profile/share/rc-scripts/...'和你的'.bashrc'可以遍历该目录,并将它们全部来源。我并不完全遵循,但我认为你说的是对的。就我所知,没有直接的机制来设置您的基础环境,并且我认为这会与Nix哲学相违背。 –