【问题标题】:Nix Hydra throws errors on imports with <symbol>, where symbol is not <nixpkgs>Nix Hydra 在使用 <symbol> 的导入时抛出错误,其中 symbol 不是 <nixpkgs>
【发布时间】:2018-05-07 13:08:09
【问题描述】:

我对 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

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

但是,当我将 working 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 包含有效的 &lt;nixpkgs&gt; 和无效的 &lt;my_package&gt;。这是我所做的唯一会产生错误的更改。

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

谁能解释一下?

【问题讨论】:

    标签: nix nixos nix-hydra


    【解决方案1】:

    我怀疑undefined variable 错误消息是直接由交换构建输入引起的。更有可能是问题已经潜伏了一段时间但从未触发,并且像这样交换输入导致它浮出水面。如果是这种情况,则不可能说出导致问题的原因,因为您已经剥离了所有相关信息。为了将来获得更好的帮助,我建议您发布一个遇到此问题的最小、完整的代码示例。您发布的内容确实很少,但不完整(问题似乎出在package/default.nix,您没有包括在内),而且看起来也不像遇到此问题的代码(基于@987654323 之类的东西@、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。这可以通过将 directory 添加到商店来管理,例如“${/tmp/project}/foo.nix”。
    • 字符串值,如"/tmp/project/foo.nix"不会导致将内容复制到存储中。
    • 计算将路径转换为字符串很容易,但很难将它们保留为路径。一个有用的技巧是使用带有路径的+ 作为第一个参数,例如/tmp + "/project" 将生成路径 /tmp/project。我们可以将它与"/.." 一起使用来提升一个级别。作为极端情况,我们可以通过执行例如将包含绝对路径的字符串转换为路径值。 with { myString = "/foo/bar"; }; /tmp + "/..${myString}",它将给出解析为 /foo/bar 的路径 /tmp/../foo/bar
    • 当可变的本地路径插入到 Nix 存储中时,它只是一个不可变的“快照”。如果稍后更改内容,可能有点无法预测是使用旧的缓存快照还是制作新快照。因此,查看错误消息中给出的路径很重要,例如看看/nix/store/...-project/foo.nix 而不是/tmp/foo.nix,因为它们可能不包含相同的东西。

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 2011-05-06
      • 2022-09-23
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多