nix nixlang:通过nix-build在default.nix中未定义的变量pkgs-打个招呼,但在nix repl中有效

问题描述 投票:1回答:1

我写了一个非常简单的default.nix文件,使用它我可以构建gnu hello包(类似于nix-pills。)>

但是现在我遇到了一个错误:

[[jane @ nixos:〜/ graphviz] $ nix-build -A hello

错误:/home/jane/graphviz/default.nix:3:47的未定义变量'pkgs'>

这是源代码:

[jane@nixos:~/graphviz]$ cat default.nix 
{
    pkgs = import <nixpkgs> {}; 
    mkDerivation = import ./autotools.nix pkgs;
    hello = import ./hello.nix { inherit mkDerivation ;};

}

对我而言,绝对没有意义,因为我在上面定义了pkgs的那一行。

由于我看不到出了什么问题,我打开了nix repl并输入了行。

nix-repl> pkgs = import <nixpkgs> {} 

nix-repl> mkDerivation = import ./autotools.nix pkgs

nix-repl> hello = import ./hello.nix { inherit mkDerivation ;}  

nix-repl> hello
«derivation /nix/store/g2y6sf5q236icvv2gwyg0lnij3mkr36j-hellooo.drv»

而且瞧,它起作用了。所以我不明白为什么default.nix会失败。我只能想象到default.nix有点特殊,但是从语法角度来看它必须很好,否则nix repl不能正常工作。

谁能解释为什么我得到这个未定义的变量错误?

编辑:问完问题后,我发现了一种解决未定义变量错误的方法,如果我这样说的话:

let pkgs = import <nixpkgs> {}; mkDerivation = import ./autotools.nix pkgs;
in
{
    hello = import ./hello.nix { inherit mkDerivation ;};

}

有效。

但是我最初的问题仍然存在。

我写了一个非常简单的default.nix文件,使用它我可以构建gnu hello包(类似于nix-pills)。但是现在我遇到了一个错误:[jane @ nixos:〜/ graphviz] $ nix-build -A ...

nix
1个回答
2
投票

{ }语法仅定义一个值。它不会将其中的属性纳入范围。您可以同时使用rec { }语法。

rec {
  pkgs = import <nixpkgs> {}; 
  mkDerivation = import ./autotools.nix pkgs;
  hello = import ./hello.nix { inherit mkDerivation ;};
}
© www.soinside.com 2019 - 2024. All rights reserved.