web-dev-qa-db-ja.com

Nix:Haskellパッケージをインストールするときにユニットテストをスキップする

Nixを使用して、リソースが限られている共有ホストの自宅の下にパッケージをインストールしています(バイナリパッケージはありません)。 git-annexをインストールしようとしています。その依存関係の1つであるhaskell-lensを構築するとき、単体テストは大量のメモリを消費するため、それらが強制終了され、インストールが失敗します。

パッケージをインストールするために単体テストをスキップする方法はありますか? Cabalビルダーとhaskell-packages.nixを調べましたが、enableCheckPhaseをfalseに設定することでテストを無効にできるようです。 ~/.nixpkgs/config.nixで次のことを試しましたが、テストはまだ実行されています。

{
    packageOverrides = pkgs: with pkgs; {
        # ...other customizations...
        haskellPackages = haskellPackages.override {
            extension = self : super : {
                self.lens = self.disableTest self.lens;
            };
        };
    };
}
9
Miikka

haskell-package.nixにある disableTest を使用して、レンズパッケージからテストを削除しようとしているようです。それがあなたのニーズを満たしていない理由を正確に伝えるために、私はいくつかのテストをしなければならないでしょう。

一般に、config.nixcabalパッケージをcabalNoTestにオーバーライドするテストを無効にしました。これは、テストをオフにする残りのhaskellパッケージで使用されるcabalパッケージをオーバーライドします。

これは私が通常それを書く方法です:

{
    packageOverrides = pkgs: with pkgs; {
        # ...other customizations...
        haskellPackages = haskellPackages.override {
            extension = self : super : {
                cabal = pkgs.haskellPackages.cabalNoTest;
            };
        };
    };
}
2
Davorak

nixpkgs受け入れられた回答が投稿されてから再編成され、テストを無効にするための新しい機能があります。ここで、Haskellパッケージをpkgs.haskell.lib.dontCheck関数でラップして、テストを無効にします。これは、OSXでビルドするときにshared-memory依存関係のテストを無効にしなければならなかったHaskellプロジェクトの1つからのNix式の例です。

{ pkgs ? import <nixpkgs> {}, compiler ? "ghc7103" }:
pkgs.haskell.packages.${compiler}.callPackage ./my-project.nix
    {   shared-memory =
            let shared-memory = pkgs.haskell.packages.${compiler}.shared-memory;
            in  if pkgs.stdenv.isDarwin
                then pkgs.haskell.lib.dontCheck shared-memory
                else shared-memory;
    }
12

別の角度から懸念に対処する別の答えは、より強力なマシンでテストしてパッケージを構築することです。次に、必要に応じてクロージャーをリモートホストにコピーします。

これは、同じアーキテクチャを使用していて、問題のソフトウェアが2台のマシンで異なるハードウェアに緊密に結合されていない場合にうまく機能します。

方法について読む マシン間でパッケージを共有する nixマニュアルを参照してください。

これは、nixのパッケージ管理へのアプローチを可能にする素晴らしい機能です。私はよくこの機能を逆に使用し、より強力なリモートマシンを使用して、ローカルマシン用に大量のソフトウェアを構築しました。

3
Davorak