Nix: Пропуск модульных тестов при установке пакета Haskell

9

Я использую Nix для установки пакетов у себя дома (то есть без бинарных пакетов) на общем хосте с ограниченными ресурсами. Я пытаюсь установить git-приложение. При построении одной из его зависимостей, 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;
            };
        };
    };
}
Микка
источник

Ответы:

2

Я вижу, вы пытаетесь использовать disableTestнайденный в haskell-package.nixдля удаления тестирования из пакетов объектива. Мне бы пришлось провести некоторое тестирование, чтобы точно сказать, почему оно не отвечает вашим потребностям.

Я выводил тестирование вообще отменяя cabalпакет в config.nixк cabalNoTest. Это переопределяет cabalпакет, используемый остальными пакетами haskell, отключая тестирование.

Вот как я обычно пишу это:

{
    packageOverrides = pkgs: with pkgs; {
        # ...other customizations...
        haskellPackages = haskellPackages.override {
            extension = self : super : {
                cabal = pkgs.haskellPackages.cabalNoTest;
            };
        };
    };
}
Davorak
источник
12

nixpkgsПосле того, как принятый ответ был опубликован, произошла реорганизация, и появилась новая функция для отключения тестов. Теперь вы можете обернуть любой пакет на Haskell pkgs.haskell.lib.dontCheckфункцией отключения тестов. Вот пример выражения Nix из одного из моих проектов на Haskell, где мне пришлось отключить тесты на shared-memoryзависимость при сборке на 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;
    }
Габриэль Гонсалес
источник
Есть ли способ выборочно отключить тестирование (с точки зрения интерактивного использования nix-build --disable-check-phase) без изменения хеша деривации / вывода?
CMCDragonkai
@CMCDragonkai: Вы не можете отключить тесты, не изменив хеш (кроме фиксированных выходных производных, которые имеют детерминированный двоичный выход). Даже если у вас все в порядке с изменением хэша, нет эргономичного способа сделать это из известной мне командной строки
Габриэль Гонсалес,
3

Альтернативный ответ, решающий вашу проблему с другой стороны, состоит в том, чтобы собрать пакеты с тестированием на более мощной машине. Затем при необходимости скопируйте замыкание на удаленный хост.

Это хорошо работает, если вы используете одну и ту же архитектуру и рассматриваемое программное обеспечение не тесно связано с каким-либо оборудованием, которое отличается на двух компьютерах.

Прочтите о том, как делиться пакетами между машинами, в руководстве по nix.

Это хорошая функция, которая включает подход nix к управлению пакетами. Я часто использовал эту функцию в обратном порядке, используя более мощные удаленные машины для создания большого количества программного обеспечения для моей локальной машины.

Davorak
источник