有些东西对我来说并不完全清楚。以下作业集:
{ nixpkgs ? import <nixpkgs>
{ config.allowUnfree = true;
config.allowBroken = true;
}
, my_package ? path/to/package/default.nix ## working expr
}:
let
jobs = {
jobA = import ../path/to/jobA/default.nix {inherit my_package;};
};
in
jobs
有2个构建输入:
- ciSrc
- nixpkgs
醇>
评估没有错误,然后构建。
但,当我将 working expr 更改为:
my_package ? import <my_package> ## problematic expr
并添加第三个构建输入:
- my_package,Local Path,path / to / package / default.nix
醇>
我收到以下错误:
hydra-eval-jobs returned exit code 1:
error: undefined variable 'foo' at /nix/store/somehash-my_package/.../default.nix:61:11
(use '--show-trace' to show detailed location information)
为什么我会得到它?我在这里错过了什么?
我的NIX_PATH包含有效的<nixpkgs>
和<my_package>
,但不是。这是我做的唯一产生错误的变化。
btw两个版本都是由nix-build构建的,正如hydra-manual所建议的那样 在同一台机器上和由九头蛇使用的同一个用户。
任何人都可以了解它吗?
答案 0 :(得分:0)
我怀疑通过交换构建输入导致undefined variable
错误消息直接。这个问题更有可能潜伏一段时间但从未触发,并且像这样交换输入已经导致它浮出水面。如果是这种情况,由于您已经删除了所有相关信息,因此无法确定导致问题的原因。为了在将来获得更好的帮助,我建议您发布遇到此问题的最小,完整的代码示例。你发布的内容确实是最小的,但它不完整(问题似乎是package/default.nix
,你没有包含它),也看起来不像遇到这个问题的代码(基于类似的东西) somehash
,path/to/package
等我认为运行此代码会首先遇到语法错误。
我们所知道的是,在没有附带绑定的情况下使用了变量。您的错误消息表明该变量名为foo
,但我认为这不是真实姓名。鉴于这些信息很少,我猜这个问题出在您的package/default.nix
文件中。
Nix中的路径需要记住一些问题:
/tmp/project/foo.nix
)将被复制到Nix商店,并将使用这些值(例如/nix/store/...-foo.nix
)而不是原始路径。这可以破坏相对路径,例如如果foo.nix
引用./bar.nix
,则后者将解析为不存在的/nix/store/bar.nix
。这可以通过将目录添加到商店来管理,例如“$ {/ tmp目录/项目} /foo.nix”。"/tmp/project/foo.nix"
,不会导致将内容复制到商店中。+
将路径作为第一个参数,例如/tmp + "/project"
将生成路径/tmp/project
。我们可以使用"/.."
来提升一个级别。作为极端情况,我们可以通过例如将包含绝对路径的字符串转换为路径值。 with { myString = "/foo/bar"; }; /tmp + "/..${myString}"
,它会将路径/tmp/../foo/bar
解析为/foo/bar
。/nix/store/...-project/foo.nix
而不是/tmp/foo.nix
,因为它们可能不包含相同的内容。