2

推导需要很多参数,但其中只有一个builder是可执行的,对吗?

而且nix-shell并没有真正执行builder,这意味着无法运行诸如export PATH=....

但是我发现其他一些派生提供了他们的虚拟 shell 环境,其中 PATH 是任意设置的,例如.envhaskell 包派生的属性。

我还发现mkDerivationbuildInput包的子目录添加/bin到 PATH(如果存在)。

他们是怎么做到的?内置派生函数是否有一些特殊参数可以让您在评估时运行自定义命令?

4

2 回答 2

1

另一种方法是在推导阶段导出特定路径——尽管我不确定这是否是正确的方法。

因此,假设您cowsay在构建某些东西时需要一个包在您的路径中,然后您可以通过添加它来使其可用:

# ... 
<nixpkgs>.stdenv.mkDerivation{
# ...
  buildPhase = '' 
    export PATH="${<nixpkgs>.cowsay}/bin:$PATH"
  '';
# ... 
}

这将使构建器在 buildPhase 期间执行该命令,并构建包并将其添加到构建阶段的路径中。您可以使用mkDerivationfor shell 执行相同的操作shellHook

# ... 
<nixpkgs>.stdenv.mkDerivation{
# ...
  shellHook = '' 
    export PATH="${<nixpkgs>.cowsay}/bin:$PATH"
  '';
# ... 
}

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

值得注意的是,默认情况下,如果派生是内置的(在buildInputs或其他任何地方,如果它有一个./bin/目录,则它对环境可用。

于 2021-05-17T12:36:18.903 回答
0

我上次检查时,nix-shell尝试在启动时运行此命令:

source $stdenv/setup

因此,当您调用该derivation函数时,您应该定义一个名为的环境变量$stdenv,该变量指向一个包含名为 的文件的目录setup,并且该文件应该是一个有效的 Bash 脚本。然后,该脚本可以定义您需要的 shell 函数和环境变量。

在我的nixcrpkgs 项目中,我的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
}
于 2020-10-26T15:55:36.177 回答