Lucchesi
topo

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:

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:

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.