如何使用 nix-build -E 构建具有覆盖的包

How to use nix-build -E to build a package with overrides

特别是,我想用 doCheck=true 进行构建。

作为起点,当我尝试使用我感兴趣的包 (singularity) 时:

nix-build '<nixpkgs>' -E '(import <nixpkgs>{}).singularity'

最终目标是这样的:

nix-build -E '(import <nixpkgs>{}).singularity.override { doCheck=true; }' --pure 

这两个都会导致错误消息:

error: expression does not evaluate to a derivation (or a set or list of those)

当然,也许还有更简单的方法来启用checkPhase,在这种情况下,我想这个问题可能有两个答案。

错误 expression does not evaluate to a derivation (or a set or list of those) 是由命令中的 '<nixpkgs>' 引起的。

摆脱它可以克服错误,但你的第二个例子失败了 匿名函数在 /nix/store/-nixos-18.09pre142796.4b649a99d84/[=32= .nix:1:1 在 /nix/store/-nixos-18.09pre142796.4b649a99d84/nixos/lib/customisation.nix:74:12[= 用意外参数 'doCheck' 调用27=]

这是因为 override 允许您修改传递给 callPackage 的集合,而该集合没有 doCheck 属性。 doCheck 是传递给 mkDerivation 和其他等效函数的集合的一部分。要更改这些属性,您需要 overrideAttrs:

 nix-build -E '(import <nixpkgs>{}).singularity.overrideAttrs (oldAttrs: { doCheck=true; })' --pure