3

为我自己的 cabal 项目禁用测试套件很容易cabal2nix,只需提供--no-check。我的项目的依赖项呢?如何在构建它们时禁用编译和运行它们的睾丸?

覆盖每个依赖项(递归!)noCheck = false似乎很乏味。是否有某种覆盖机制可用?

4

1 回答 1

3

确实有!要为所有包递归更改某些内容,您可以覆盖生成所有包的内容,即haskellPackages.mkDerivation. 所以这可以通过这样的 Haskell 包覆盖来实现:

hself: hsuper: {
  mkDerivation = args: hsuper.mkDerivation (args // {
    doCheck = false;
  });
}

您也可以像这样覆盖此处的其他参数。例如,您可以禁用库分析构建,这通常会使构建时间减半:

hself: hsuper: {
  mkDerivation = args: hsuper.mkDerivation (args // {
    enableLibraryProfiling = false;
  });
}

有关详细信息,请参阅手册中的此部分

编辑:如果您想将此用作用户叠加层,您可以将以下内容放入~/.config/nixpkgs/overlays/haskell-no-check.nix

self: super: {
  haskell = super.haskell // {
    packageOverrides = hself: hsuper: {
      mkDerivation = args: hsuper.mkDerivation (args // {
        doCheck = false;
      });
    };
  };
}

请注意,这是使用haskell.packageOverrides,而不是packageOverridesconfig.nix.

还有其他方法可以做到这一点,但我认为在这种情况下这是最好的,因为它将更改应用于所有 Haskell 包集。不幸的是,由于覆盖的工作方式,这将清除 previous packageOverrides,这通常不是问题,但可以。如果你需要坚持以前的,那么你可以这样做:

self: super: {
  haskell = super.haskell // {
    packageOverrides = super.lib.composeExtensions super.haskell.packageOverrides
      (hself: hsuper: {
        mkDerivation = args: hsuper.mkDerivation (args // {
          doCheck = false;
        });
      });
  };
}
于 2019-09-09T13:03:34.197 回答