【发布时间】:2019-08-30 10:29:30
【问题描述】:
使用cabal2nix 为我自己的阴谋集团项目禁用测试套件很容易,只需提供--no-check。我的项目的依赖项呢?如何在构建它们时禁用编译和运行它们的睾丸?
用noCheck = false 覆盖每个依赖项(递归!)似乎很乏味。是否有某种覆盖机制可用?
【问题讨论】:
使用cabal2nix 为我自己的阴谋集团项目禁用测试套件很容易,只需提供--no-check。我的项目的依赖项呢?如何在构建它们时禁用编译和运行它们的睾丸?
用noCheck = false 覆盖每个依赖项(递归!)似乎很乏味。是否有某种覆盖机制可用?
【问题讨论】:
确实有!要为所有包递归更改某些内容,您可以覆盖生成所有包的内容,即haskellPackages.mkDerivation。因此,这可以通过这样的 Haskell 包覆盖来实现:
hself: hsuper: {
mkDerivation = args: hsuper.mkDerivation (args // {
doCheck = false;
});
}
您还可以像这样覆盖来自here 的其他参数。例如,您可以禁用库分析构建,这通常会使构建时间减半:
hself: hsuper: {
mkDerivation = args: hsuper.mkDerivation (args // {
enableLibraryProfiling = false;
});
}
有关详细信息,请参阅手册中的this section。
编辑:如果你想把它用作用户覆盖,你可以在~/.config/nixpkgs/overlays/haskell-no-check.nix中加入以下内容:
self: super: {
haskell = super.haskell // {
packageOverrides = hself: hsuper: {
mkDerivation = args: hsuper.mkDerivation (args // {
doCheck = false;
});
};
};
}
请注意,这里使用的是haskell.packageOverrides,而不是config.nix 中有些弃用的packageOverrides。
还有其他方法可以做到这一点,但我认为在这种情况下这是最好的,因为它将更改应用于所有 Haskell 包集。不幸的是,由于覆盖的工作原理,这将清除以前的packageOverrides,这通常不是问题,但可以。如果你需要坚持以前的,那么你可以这样做:
self: super: {
haskell = super.haskell // {
packageOverrides = super.lib.composeExtensions super.haskell.packageOverrides
(hself: hsuper: {
mkDerivation = args: hsuper.mkDerivation (args // {
doCheck = false;
});
});
};
}
【讨论】:
~/.config/nixpkgs/overlays/haskell-packages.nix 这样的叠加层中?我看到你写的表达式可能是packageOverrides 的参数。但是 IIUC,有点不赞成使用覆盖。