禁用Nix构建中所有Haskell依赖项的构建和运行测试

时间:2019-08-30 10:29:30

标签: haskell cabal nix

使用cabal2nix为我自己的阴谋计​​划禁用测试套件很容易,只需提供--no-check。我项目的依赖项又如何呢?在构建它们时,如何禁用其编译和运行它们的测试脚本?

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

1 个答案:

答案 0 :(得分:1)

确实有!要递归更改所有软件包,可以覆盖生成所有软件包的事物,即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,而不是packageOverrides中已经过时的config.nix

还有其他方法可以做到,但是我认为在这种情况下这是最好的,因为它将更改应用于所有Haskell软件包集。不幸的是,由于重写的工作原理,这会清除以前的packageOverrides,这通常不是问题,但是可以。如果您需要保留以前的版本,则可以执行以下操作:

self: super: {
  haskell = super.haskell // {
    packageOverrides = super.lib.composeExtensions super.haskell.packageOverrides
      (hself: hsuper: {
        mkDerivation = args: hsuper.mkDerivation (args // {
          doCheck = false;
        });
      });
  };
}
相关问题