Nix: Melewatkan pengujian unit saat menginstal paket Haskell

9

Saya menggunakan Nix untuk menginstal paket di bawah rumah saya (jadi tidak ada paket biner) pada host bersama dengan sumber daya terbatas. Saya mencoba menginstal git-annex. Ketika membangun salah satu dependensinya, lensa haskell, unit test mengkonsumsi begitu banyak memori sehingga terbunuh dan instalasi gagal.

Apakah ada cara untuk melewatkan tes unit untuk mendapatkan paket diinstal? Saya melihat pembuat Cabal dan haskell-packages.nixdan menurut saya Anda bisa menonaktifkan tes dengan menetapkan enableCheckPhasefalse. Saya mencoba yang berikut ~/.nixpkgs/config.nix, tetapi tes masih berjalan:

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

Jawaban:

2

Saya melihat Anda mencoba menggunakan yang disableTestditemukan haskell-package.nixuntuk menghapus pengujian dari paket lensa. Saya harus melakukan beberapa pengujian untuk memberi tahu Anda dengan tepat mengapa itu tidak memenuhi kebutuhan Anda.

Saya telah menonaktifkan pengujian secara umum dengan mengabaikan cabalpaket config.nixke cabalNoTest. Ini menimpa cabalpaket yang digunakan oleh sisa paket haskell untuk mematikan pengujian.

Beginilah biasanya saya menulisnya:

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

nixpkgsmengatur ulang hal-hal sejak jawaban yang diterima diposting dan ada fungsi baru untuk menonaktifkan tes. Anda sekarang membungkus paket Haskell dengan pkgs.haskell.lib.dontCheckfungsi untuk menonaktifkan tes. Berikut adalah contoh ekspresi Nix dari salah satu proyek Haskell saya di mana saya harus menonaktifkan tes untuk shared-memoryketergantungan ketika membangun pada OS X:

{ 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;
    }
Gabriel Gonzalez
sumber
Apakah ada cara untuk menonaktifkan pengujian secara selektif (dari perspektif penggunaan interaktif nix-build --disable-check-phase) tanpa mengubah hash derivasi / keluaran?
CMCDragonkai
@ CMCDragonkai: Anda tidak dapat menonaktifkan tes tanpa mengubah hash (kecuali untuk derivasi output tetap yang memiliki output biner deterministik). Bahkan jika Anda baik-baik saja dengan mengubah hash, tidak ada cara ergonomis untuk melakukannya dari baris perintah yang saya tahu
Gabriel Gonzalez
3

Jawaban alternatif, mengatasi masalah Anda dari sudut yang berbeda, adalah membuat paket Anda dengan pengujian pada mesin yang lebih kuat. Kemudian ketika perlu menyalin penutupan ke host jarak jauh.

Ini bekerja dengan baik jika Anda berada pada arsitektur yang sama dan perangkat lunak yang dimaksud tidak digabungkan dengan perangkat keras yang berbeda pada kedua mesin.

Baca tentang cara berbagi paket antar mesin dalam manual nix.

Ini adalah fitur yang bagus yang memungkinkan pendekatan nix untuk manajemen paket. Saya sering menggunakan fitur ini secara terbalik, menggunakan mesin jarak jauh yang lebih kuat untuk membangun sejumlah besar perangkat lunak untuk mesin lokal saya.

Davorak
sumber