微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nix:派生如何在nix-shell中设置PATH而无需调用builder?

如何解决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

对 shell 的 shellHook 执行相同的操作
# ... 
<nixpkgs>.stdenv.mkDerivation{
# ...
  shellHook = '' 
    export PATH="${<nixpkgs>.cowsay}/bin:$PATH"
  '';
# ... 
}

然后该路径将在您的 shell 环境中可用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。