0

我对 hydra 有一些不完全清楚的事情。以下作业集:

{ 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 个构建输入:

  1. ciSrc
  2. nixpkgs

评估没有错误,然后被构建。

但是,当我将工作 expr更改为:

my_package  ? import <my_package> ## problematic expr

并添加第三个构建输入:

  1. my_package, 本地路径, 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>无效的。这是我所做的唯一会产生错误的更改。

顺便说一句,这两个版本都是由 nix-build 构建的,正如同一台机器上的hydra 手册 和 hydra 使用的同一用户所推荐的那样。

任何人都可以阐明它吗?

4

1 回答 1

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/project}/foo.nix”。
  • 字符串值,例如"/tmp/project/foo.nix"不会导致将内容复制到存储中。
  • 计算将路径转换为字符串很容易,但很难将它们保留为路径。一个有用的技巧是使用+path 作为第一个参数,例如/tmp + "/project"将产生 path /tmp/project。我们可以使用它"/.."来提升一个级别。作为极端情况,我们可以通过执行 eg 将包含绝对路径的字符串转换为路径值with { myString = "/foo/bar"; }; /tmp + "/..${myString}",这将给出/tmp/../foo/bar解析为的路径/foo/bar
  • 当一个可变的本地路径被插入到 Nix 存储中时,它只是一个不可变的“快照”。如果稍后更改内容,可能有点无法预测是使用旧的缓存快照还是制作新快照。出于这个原因,查看错误消息中给出的路径很重要,例如查看/nix/store/...-project/foo.nix而不是/tmp/foo.nix,因为它们可能不包含相同的内容。
于 2018-05-21T13:45:43.293 回答