【问题标题】:Disable building and running tests for all Haskell dependencies in a Nix build在 Nix 构建中禁用所有 Haskell 依赖项的构建和运行测试
【发布时间】:2019-08-30 10:29:30
【问题描述】:

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

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

【问题讨论】:

    标签: haskell cabal nix


    【解决方案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,而不是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,有点不赞成使用覆盖。
    猜你喜欢
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2022-01-18
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    相关资源
    最近更新 更多