Ambiente de construção e artefato Haskell semelhante ao Maven

20

Eu era desenvolvedor Java há muito tempo, mas recentemente entrei para uma equipe da Haskell. No mundo java, se você tiver um projeto grande, com várias equipes trabalhando nele, uma abordagem comum é usar um servidor de artefato como o Maven para facilitar e acelerar o desenvolvimento. Várias ferramentas de construção, como Ant, Maven, Gradle, podem criar o projeto e fazer upload de um arquivo jar para o servidor de artefato que pode ser usado pelo restante da equipe sem problemas. Portanto, dividindo o projeto em subprojetos menores, o tempo de construção também é drasticamente reduzido.

No lado Haskell, estamos usando cabalpara construir o projeto. Nosso projeto leva de 10 a 15 minutos para ser desenvolvido sem otimização. Demora algumas horas se a otimização do compilador estiver ativada, o que é doloroso.

Eu me pergunto, como podemos fazer a mesma coisa que fazemos em Java aqui. Existe uma maneira fácil de compilar e fazer upload do binário dos pacotes (bibliotecas) em um servidor de artefato e usar os binários pré-criados no momento da construção? Eu sei que, como o Haskell gera código de máquina (em vez de código de bytes em Java), pode haver problemas de compatibilidade, mas provavelmente podemos ter binários diferentes para diferentes arquiteturas / SOs armazenados no servidor de artefato.

Oxy
fonte
Não é uma resposta para sua pergunta, mas você invoca "cabal build / install" com a opção -j?
Daniel Díaz Carrete
Sim, mas não vejo muita aceleração. O uso da CPU é de cerca de 15% a 20% na construção. Não tenho a certeza onde está o problema: cabal, GHC, Test.Frameworkou o ligador.
Oxy
De acordo com esta resposta do SO, stackoverflow.com/questions/27173910/…, o principal motivo é a natureza nativa dos executáveis ​​Haskell.
Daniel Díaz Carrete
Eu estou falando principalmente sobre desenvolvimento. É verdade que o binário pode causar incompatibilidade devido a diferentes sistemas operacionais, arquiteturas de CPU e até versões de compiladores. Mas, por que eu deveria perder tanto tempo desenvolvendo na mesma máquina, no mesmo sistema operacional e no mesmo compilador todos os dias?
Oxy
Parece que Halcyon com um cache pode ser útil: halcyon.sh/reference/#private-storage-options
Lubomír Sedlář 6/15

Respostas:

2

Você pode considerar usar o Nix , que é um gerenciador de pacotes de plataforma cruzada de uso geral e com suporte decente para Haskell.

O Nix possui uma linguagem de programação personalizada para definir pacotes (que por acaso é pura, funcional e preguiçosa). Definir novos pacotes e estender os existentes é muito fácil (por exemplo, alterar dependências, obter o código-fonte de um repositório git diferente etc.).

Os pacotes são identificados por hashes, que incluem dependências. Portanto, várias versões, ou a mesma versão com diferentes dependências, podem viver lado a lado sem conflito. O Nix pode procurar o hash desejado em um servidor de "cache binário", para ver se esse pacote específico com essas dependências específicas já foi construído; Nesse caso, ele fará o download do produto de compilação em vez de compilar.

Atualmente, o repositório nixpkgs inclui a maioria / toda a Hackage, várias versões do GHC (7.10.1, 7.8.4 e algumas infra-estruturas JS) e um cabal2nixutilitário que faz um bom trabalho ao gerar pacotes Nix a partir de arquivos .cabal. Há também o servidor de CI "hydra" baseado em Nix, que você pode usar para acionar compilações com base em confirmações de SCM.

Warbo
fonte