Nix: Ignorando testes de unidade ao instalar um pacote Haskell

9

Estou usando o Nix para instalar pacotes em minha casa (portanto, não há pacotes binários) em um host compartilhado com recursos limitados. Estou tentando instalar o git-anexo. Ao criar uma de suas dependências, a lente haskell, os testes de unidade consomem tanta memória que são mortos e a instalação falha.

Existe uma maneira de pular os testes de unidade para instalar o pacote? Eu olhei para o construtor Cabal e haskell-packages.nixparece-me que você pode desativar os testes definindo enableCheckPhasefalse. Tentei o seguinte em ~/.nixpkgs/config.nix, mas os testes ainda são executados:

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

Respostas:

2

Vejo você tentando usar o disableTestencontrado em haskell-package.nixpara remover os testes dos pacotes de lentes. Eu precisaria fazer alguns testes para dizer exatamente por que ele não atende às suas necessidades.

Eu tenho testes deficientes em geral substituindo o cabalpacote em config.nixpara cabalNoTest. Isso substitui o cabalpacote usado pelo restante dos pacotes haskell que desativam o teste.

É assim que eu normalmente escrevo:

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

nixpkgsreorganizou as coisas desde que a resposta aceita foi postada e há uma nova função para desativar os testes. Agora você envolve qualquer pacote Haskell com a pkgs.haskell.lib.dontCheckfunção de desativar os testes. Aqui está um exemplo de expressão Nix de um dos meus projetos Haskell em que tive que desativar os testes para a shared-memorydependência ao criar no 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
fonte
Existe uma maneira de desativar seletivamente o teste (da perspectiva do uso interativo nix-build --disable-check-phase) sem alterar o hash de derivação / saída?
CMCDragonkai
@CMCDragonkai: Você não pode desativar os testes sem alterar o hash (exceto as derivações de saída fixa que possuem saída binária determinística). Mesmo se você está bem com mudando o hash não existe uma maneira ergonómica para fazê-lo a partir da linha de comando que eu saiba
Gabriel Gonzalez
3

Uma resposta alternativa, abordando sua preocupação de um ângulo diferente, é compilar seus pacotes com testes em uma máquina mais poderosa. Em seguida, quando necessário, copie o fechamento para o host remoto.

Isso funciona bem se você estiver na mesma arquitetura e o software em questão não estiver totalmente acoplado a nenhum hardware diferente nas duas máquinas.

Leia sobre como compartilhar pacotes entre máquinas no manual nix.

Esse é um recurso interessante que habilita a abordagem do nix ao gerenciamento de pacotes. Costumo usar esse recurso ao contrário, usando máquinas remotas mais poderosas para criar grandes quantidades de software para minha máquina local.

Davorak
fonte