如何解决Nix:派生如何在nix-shell中设置PATH而无需调用builder?
派生需要很多参数,但是只有其中一个 builder 是可执行的吗?
nix-shell 并没有真正执行 builder ,这意味着无法运行诸如export PATH=...
之类的命令。
但是我发现其他一些派生提供了它们的虚拟shell环境,在其中可以任意设置PATH,例如haskell软件包派生的.env
属性。
我还发现mkDerivation
将 buildInput 包的子/bin
目录添加到PATH(如果存在)。
他们是如何做到的?内置的 derivation 函数有一些特殊的参数,可让您在评估时运行自定义命令吗?
解决方法
我上次检查时,nix-shell
尝试在启动时运行此命令:
source $stdenv/setup
因此,在调用derivation
函数时,应定义一个名为$stdenv
的环境变量,该变量指向一个名为setup
的文件的目录,并且该文件应为有效的Bash。脚本。然后,该脚本可以定义所需的Shell函数和环境变量。
在我的nixcrpkgs project中,我的setup
脚本只有一行:
export PATH=$_PATH
因此,我将_PATH
作为参数传递给derivation
,然后我的setup
脚本将其复制到PATH环境变量中。
我们不能仅在派生中设置PATH,因为nix-shell将使派生的PATH覆盖系统PATH,这意味着我们不能在主机系统中使用“ git”或“ which”之类的实用程序。
下面是一些伪代码,显示您需要执行的操作:
derivation {
stdenv = ./my_pretened_stdenv; # directory that has setup script in it
_PATH = "/stuff/bin:/more_stuff/bin";
# other attributes
}
,
另一种方法是在推导阶段导出特定路径 - 尽管我不确定这是否是正确的方法。
因此,假设您在构建某些东西时需要一个包 cowsay
在您的路径中,然后您可以通过添加它来使其可用:
# ...
<nixpkgs>.stdenv.mkDerivation{
# ...
buildPhase = ''
export PATH="${<nixpkgs>.cowsay}/bin:$PATH"
'';
# ...
}
这将使构建器在 buildPhase 期间执行该命令,并构建包并将其添加到构建阶段的路径中。您可以使用 mkDerivation
shellHook
执行相同的操作
# ...
<nixpkgs>.stdenv.mkDerivation{
# ...
shellHook = ''
export PATH="${<nixpkgs>.cowsay}/bin:$PATH"
'';
# ...
}
然后该路径将在您的 shell 环境中可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。