Haskell · build · ferramentas
Stack vs Cabal: escolher uma ferramenta de build Haskell
Depois de instalar um compilador Haskell, precisa de uma forma de gerir as dependências e construir o seu projeto. Em 2026, há duas escolhas mainstream: Cabal e Stack. Fazem o mesmo trabalho de base — obter as bibliotecas, construir o seu código, correr os testes — mas fazem compromissos diferentes quanto à proveniência dos pacotes e ao grau de reprodutibilidade das builds. Este guia explica o que é cada um, em que diferem, os comandos equivalentes e como escolher.
O que é o Cabal
O Cabal é o sistema de build original do Haskell. O termo abrange duas coisas: a biblioteca/especificação Cabal (o formato de ficheiro .cabal que descreve um pacote) e o cabal-install, a ferramenta de linha de comandos cabal que constrói os pacotes e resolve as dependências. Por defeito obtém as bibliotecas do Hackage, o arquivo central dos pacotes Haskell.
O Cabal moderno usa as builds locais ao estilo nix (os antigos comandos v2-, agora por defeito), que dão a cada projeto uma build isolada e um store global partilhado de pacotes construídos. Um resolvedor de dependências escolhe as versões que satisfazem os limites que declara:
-- in your .cabal file
build-depends: base >=4.14 && <5, text, aeson ^>=2.1 O operador caret ^>= significa « pelo menos esta versão, mas permite apenas as versões posteriores compatíveis ». As definições ao nível do projeto vivem num ficheiro cabal.project. É a toolchain mais estreitamente alinhada com as releases do GHC e do Hackage.
O que é o Stack
O Stack é uma ferramenta de build concebida em torno da reprodutibilidade. Em vez de resolver as versões contra todo o Hackage, constrói contra um snapshot Stackage: um conjunto curado de versões de pacotes que se sabe compilarem em conjunto. Fixa um snapshot em stack.yaml:
resolver: lts-22.14
packages:
- . Como o snapshot fixa cada versão, qualquer pessoa que obtenha o seu projeto e corra stack build obtém as mesmas versões de dependências — e o Stack instalará automaticamente o GHC correspondente a esse snapshot. Esta garantia « funciona igual em todo o lado » é o principal atrativo do Stack, sobretudo para equipas e CI.
As diferenças chave
- Fonte dos pacotes — o Cabal resolve contra todo o Hackage; o Stack constrói contra um snapshot Stackage curado. O Stackage troca um pouco de atualidade por conjuntos garantidamente compatíveis.
- Reprodutibilidade — o Stack fixa tudo através do snapshot por defeito. O Cabal pode ser igualmente reprodutível com um ficheiro
cabal.project.freeze, mas ativa-o explicitamente. - Gestão do GHC — o Stack descarrega e gere a versão de GHC de que um snapshot precisa. Com o Cabal, traz o seu próprio GHC (habitualmente instalado via GHCup).
- Ficheiros de configuração — ambos leem o ficheiro
.cabaldo pacote. O Stack acrescentastack.yaml; o Cabal acrescentacabal.project. - Alinhamento com o ecossistema — o Cabal segue de perto as releases do GHC e do Hackage; o Stack avança ao ritmo da curadoria dos snapshots.
Os comandos equivalentes
No dia a dia, os dois são parecidos:
-- Cabal -- Stack
cabal build stack build
cabal run myapp stack run
cabal test stack test
cabal repl stack ghci
cabal haddock stack haddock Ambos conduzem o mesmo compilador por baixo — veja o guia do GHC para as opções que importam. Note que o Cabal de hoje descende do workflow introduzido no Cabal 2.0, que substituiu a antiga abordagem das sandboxes.
Qual escolher?
Em 2026, ambos são bons e ativamente mantidos — não é um caso em que um esteja obsoleto. Uma regra prática razoável:
- Escolha o Cabal se quiser a toolchain por defeito alinhada com o GHC, as versões mais recentes de pacotes do Hackage e um controlo fino sobre os limites de versões. É o caminho que a maioria dos novos tutoriais pressupõe.
- Escolha o Stack se valoriza a reprodutibilidade chave na mão e a gestão automática do GHC, ou se está numa equipa onde « toda a gente obtém a mesma build » conta mais do que ter as versões de bibliotecas mais recentes.
Não tem de decidir para sempre: o GHCup instala ambos, e muitos projetos incluem um stack.yaml e um cabal.project para que os contribuidores possam usar um ou outro. Experimente um e mude se os seus compromissos não convencerem.
FAQ
Cabal ou Stack, qual é melhor? Nenhum é estritamente melhor; otimizam para coisas diferentes. O Cabal privilegia as versões Hackage atualizadas e o alinhamento estreito com o GHC; o Stack privilegia snapshots curados e reprodutíveis e a instalação automática do GHC.
O Stack e o Cabal usam o mesmo formato de pacote? Sim. Ambos leem o ficheiro .cabal do pacote. O Stack acrescenta stack.yaml por cima; o Cabal acrescenta cabal.project.
O que é um snapshot Stackage? Um conjunto curado de versões de pacotes Hackage verificadas para compilar em conjunto, identificado por um resolver como lts-22.14. Fixar um torna as builds reprodutíveis.
Posso passar do Stack para o Cabal mais tarde? Geralmente sim — o ficheiro .cabal é partilhado, por isso acrescenta sobretudo um cabal.project e fornece um GHC (via GHCup). Os limites de versões podem exigir uma pequena limpeza.
Novo na toolchain? Comece por instalar o Haskell com o GHCup, que configura o GHC, o Cabal e o Stack em conjunto.
Compila Haskell mais depressa
Tanto o Stack como o Cabal compilam mais depressa com mais núcleos e RAM do que um portátil — prático para projetos grandes e CI. A Infomaniak, fornecedor suíço que respeita a privacidade, oferece VPS e servidores cloud para as tuas builds.
Ver o cloud da Infomaniak →Link de afiliado — apoia estes guias gratuitos.