Nix: Pomijanie testów jednostkowych podczas instalowania pakietu Haskell

9

Używam Nix do instalowania pakietów w moim domu (więc nie ma pakietów binarnych) na współdzielonym hoście z ograniczonymi zasobami. Próbuję zainstalować załącznik git. Podczas budowania jednej z jej zależności, soczewki haskell, testy jednostkowe zużywają tyle pamięci, że zostają zabite, a instalacja kończy się niepowodzeniem.

Czy istnieje sposób na pominięcie testów jednostkowych w celu zainstalowania pakietu? Spojrzałem na konstruktora Cabala i haskell-packages.nixwydaje mi się, że można wyłączyć testy, ustawiając wartość enableCheckPhasefalse. Próbowałem następujące ~/.nixpkgs/config.nix, ale testy są nadal uruchomione:

{
    packageOverrides = pkgs: with pkgs; {
        # ...other customizations...
        haskellPackages = haskellPackages.override {
            extension = self : super : {
                self.lens = self.disableTest self.lens;
            };
        };
    };
}
Miikka
źródło

Odpowiedzi:

2

Widzę, że próbujesz użyć disableTestznajdującego się w haskell-package.nixcelu usunięcia testów z pakietów soczewek. Musiałbym wykonać kilka testów, aby dokładnie powiedzieć, dlaczego nie spełnia twoich potrzeb.

Wyłączyłem ogólne testowanie, zastępując cabalpakiet config.nixdo cabalNoTest. cabalZastępuje to pakiet używany przez pozostałe pakiety haskell wyłączające testowanie.

Tak zwykle to piszę:

{
    packageOverrides = pkgs: with pkgs; {
        # ...other customizations...
        haskellPackages = haskellPackages.override {
            extension = self : super : {
                cabal = pkgs.haskellPackages.cabalNoTest;
            };
        };
    };
}
Davorak
źródło
12

nixpkgszreorganizowano rzeczy od czasu opublikowania zaakceptowanej odpowiedzi i wprowadzono nową funkcję wyłączania testów. Teraz zawijasz dowolny pakiet Haskell z pkgs.haskell.lib.dontCheckfunkcją wyłączania testów. Oto przykładowe wyrażenie Nix z jednego z moich projektów Haskell, w którym musiałem wyłączyć testy shared-memoryzależności podczas budowania na 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
źródło
Czy istnieje sposób selektywnego wyłączania testowania (z interaktywnej perspektywy użytkowania, takiej jak nix-build --disable-check-phase) bez zmiany skrótu wyprowadzania / wyjścia?
CMCDragonkai
@CMCDragonkai: Nie można wyłączyć testów bez zmiany skrótu (z wyjątkiem stałych pochodnych wyjściowych, które mają deterministyczne wyjście binarne). Nawet jeśli zgadzasz się na zmianę skrótu, nie ma ergonomicznego sposobu, aby to zrobić z wiersza poleceń, który znam
Gabriel Gonzalez
3

Alternatywną odpowiedzią, która rozwiązuje problem z innej strony, jest budowanie pakietów za pomocą testów na mocniejszej maszynie. Następnie w razie potrzeby skopiuj zamknięcie do zdalnego hosta.

Działa to dobrze, jeśli korzystasz z tej samej architektury, a oprogramowanie, o którym mowa, nie jest ściśle powiązane z żadnym innym sprzętem na obu komputerach.

Przeczytaj o tym, jak współdzielić pakiety między komputerami w instrukcji nix.

To miła funkcja, która umożliwia podejście Nix do zarządzania pakietami. Często korzystałem z tej funkcji w odwrotnej kolejności, używając bardziej wydajnych maszyn zdalnych do tworzenia dużej ilości oprogramowania dla mojego komputera lokalnego.

Davorak
źródło