Crie seus projetos Haskell com o Docker e o Stack
Evite conflitos de dependência e incompatibilidades entre versões do GHC instalando o Haskell com o Docker e o Stack.
O Docker e o Stack são a solução para aquela máxima: “mas funciona na minha máquina” — que todo programador já ouviu pelo menos uma vez na vida.
Neste artigo você vai aprender os principais conceitos dessas tecnologias e como configurá-las para criar um ambiente de desenvolvimento Haskell que possibilite:
- Compilar, testar e executar sua aplicação em um contêiner Docker.
- Executar uma sessão do GHCi em um contêiner Docker e carregar os módulos do seu projeto de forma transparente.
Docker e Stack
O Docker possibilita o empacotamento de uma aplicação ou ambiente inteiro dentro de um contêiner, cuja portabilidade pode ser realizada para qualquer servidor que possua o Docker instalado.
O Stack é um programa para o desenvolvimento de aplicações Haskell que possui mecanismos de integração transparente com o Docker. Com o Stack, nós podemos:
- Instalar uma versão específica do compilador GHC.
- Instalar pacotes Haskell.
- Gerenciar o build da aplicação.
- Executar testes.
- Fazer benchmarking.
Instalando as ferramentas
Faça o download e instale o Docker seguindo as instruções neste link.
Então instale a versão mais recente do Stack com o comando:
curl -sSL https://get.haskellstack.org/ | sh
Na data em que escrevo, a última versão do Stack é a:
stack --version $ Version 1.3.2, Git revision 3f675146590da4f3edf768b89355f798229da2a5 (4395 commits) x86_64 hpack-0.15.0
Criando um projeto
Agora vá até o diretório onde você deseja criar o seu projeto e execute:
stack new hello-haskell simple
O comando stack new
cria dentro da pasta hello-haskell
uma estrutura básica de projeto a partir do template simple
(digite stack templates
para ver outros templates disponíveis).
Assim que o comando terminar, insira as seguintes linhas no início do arquivo stack.yaml
:
docker:
enable: true
image: haskell
A linha 3 serve para especificar a imagem Docker que deve ser usada para criar o contêiner. A opção image: haskell
sinaliza para o Stack que ele deve utilizar a imagem oficial do Haskell. Na verdade, essa linha é opcional. Eu a uso apenas porque a imagem oficial atende aos nossos requisitos e é consideravelmente menor do que a fpco/stack-build, que é a imagem que o Stack usa por padrão.
Agora é só executar os dois últimos comandos para fazer o download da imagem haskell do DockerHub e executar a aplicação hello-haskell
dentro do contêiner:
stack docker pull
stack build && stack exec hello-haskell
Se tudo estiver certo, você deve ver o clássico “hello world” na saída padrão!
Usando o REPL
É muito comum no desenvolvimento de aplicações Haskell nós editarmos um arquivo fonte e recarregarmos o projeto ou módulo no interpretador (GHCi) para testar alguma funcionalidade.
Para fazer isso, basta digitar:
stack ghci
De forma similar, para executar os testes da aplicação, podemos fazer:
stack test
Como fizemos a integração com o Docker, os comandos acima são recebidos pelo Stack no host e redirecionados de maneira transparente para o respectivo contêiner.