Nix Hydra使用<symbol>抛出导入错误,其中symbol不是<nixpkgs>

时间:2017-11-23 14:21:48

标签: nix nixos

有些东西对我来说并不完全清楚。以下作业集:

{ 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.   
  3. nixpkgs
  4.   

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

,当我将 working expr 更改为:

my_package  ? import <my_package> ## problematic expr

并添加第三个构建输入:

  
      
  1. my_package,Local Path,path / to / package / default.nix
  2.   

我收到以下错误:

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所建议的那样 在同一台机器上和由九头蛇使用的同一个用户。

任何人都可以了解它吗?

1 个答案:

答案 0 :(得分:0)

我怀疑通过交换构建输入导致undefined variable错误消息直接。这个问题更有可能潜伏一段时间但从未触发,并且像这样交换输入已经导致它浮出水面。如果是这种情况,由于您已经删除了所有相关信息,因此无法确定导致问题的原因。为了在将来获得更好的帮助,我建议您发布遇到此问题的最小,完整的代码示例。你发布的内容确实是最小的,但它不完整(问题似乎是package/default.nix,你没有包含它),也看起来不像遇到这个问题的代码(基于类似的东西) somehashpath/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商店时,它只是一个不可变的“快照”。如果稍后更改内容,是否将使用旧的缓存快照或是否将创建新快照可能有点不可预测。出于这个原因,重要的是要查看错误消息中给出的路径,例如请查看/nix/store/...-project/foo.nix而不是/tmp/foo.nix,因为它们可能不包含相同的内容。