Haskell · build · tooling
Stack vs Cabal: elegir una herramienta de compilación de Haskell
Una vez que tienes instalado un compilador de Haskell, necesitas una forma de gestionar las dependencias y compilar tu proyecto. En 2026 hay dos opciones principales: Cabal y Stack. Hacen el mismo trabajo de fondo — obtener bibliotecas, compilar tu código, ejecutar tests — pero toman decisiones distintas sobre de dónde vienen los paquetes y cuán reproducibles son las builds. Esta guía explica qué es cada una, en qué se diferencian, los comandos equivalentes y cómo elegir.
Qué es Cabal
Cabal es el sistema de compilación original de Haskell. La palabra abarca dos cosas: la biblioteca/especificación Cabal (el formato de archivo .cabal que describe un paquete) y cabal-install, la herramienta de línea de comandos cabal que compila paquetes y resuelve dependencias. Por defecto obtiene las bibliotecas de Hackage, el archivo central de paquetes de Haskell.
El Cabal moderno usa builds locales al estilo Nix (los antiguos comandos v2-, ahora los predeterminados), que dan a cada proyecto una build aislada y un almacén global compartido de paquetes compilados. Un resolutor de dependencias elige las versiones que satisfacen los límites que declaras:
-- in your .cabal file
build-depends: base >=4.14 && <5, text, aeson ^>=2.1 El operador caret ^>= significa "al menos esta versión, pero permite solo las posteriores compatibles." Los ajustes de todo el proyecto viven en un archivo cabal.project. Este es el toolchain más estrechamente alineado con los lanzamientos de GHC y Hackage.
Qué es Stack
Stack es una herramienta de compilación construida en torno a la reproducibilidad. En lugar de resolver versiones contra todo Hackage, compila contra un snapshot de Stackage: un conjunto curado de versiones de paquetes que se sabe que compilan juntas. Fijas un snapshot en stack.yaml:
resolver: lts-22.14
packages:
- . Como el snapshot fija cada versión, cualquiera que clone tu proyecto y ejecute stack build obtiene las mismas versiones de dependencias — y Stack instalará automáticamente el GHC que ese snapshot necesita. Esa garantía de que "funciona igual en todas partes" es el principal atractivo de Stack, especialmente para equipos y CI.
Las diferencias clave
- Origen de los paquetes — Cabal resuelve contra todo Hackage; Stack compila contra un snapshot curado de Stackage. Stackage cambia algo de frescura por conjuntos con compatibilidad garantizada.
- Reproducibilidad — Stack fija todo mediante el snapshot por defecto. Cabal puede ser igual de reproducible con un archivo
cabal.project.freeze, pero optas por ello. - Gestión de GHC — Stack descarga y gestiona la versión de GHC que necesita un snapshot. Con Cabal, traes tu propio GHC (normalmente instalado mediante GHCup).
- Archivos de configuración — ambos leen el archivo
.cabaldel paquete. Stack añadestack.yaml; Cabal añadecabal.project. - Alineación con el ecosistema — Cabal sigue de cerca los lanzamientos de GHC y Hackage; Stack avanza al ritmo de la curación de snapshots.
Los comandos equivalentes
En el día a día, las dos se sienten parecidas:
-- Cabal -- Stack
cabal build stack build
cabal run myapp stack run
cabal test stack test
cabal repl stack ghci
cabal haddock stack haddock Ambas dirigen el mismo compilador por debajo — consulta la guía de GHC para los flags que importan. Ten en cuenta que el Cabal de hoy desciende del flujo de trabajo introducido en Cabal 2.0, que reemplazó el antiguo enfoque de sandbox.
¿Cuál deberías elegir?
En 2026, ambas son buenas y se mantienen activamente — no es un caso en el que una esté obsoleta. Una regla razonable:
- Elige Cabal si quieres el toolchain por defecto y alineado con GHC, las últimas versiones de paquetes de Hackage y un control fino sobre los límites de versión. Es el camino que asumen la mayoría de los tutoriales nuevos.
- Elige Stack si valoras la reproducibilidad lista para usar y la gestión automática de GHC, o si estás en un equipo donde "todos obtienen la misma build" importa más que tener las versiones de bibliotecas más nuevas.
No tienes que decidir para siempre: GHCup instala ambas, y muchos proyectos incluyen un stack.yaml y un cabal.project para que los colaboradores puedan usar cualquiera de las dos. Prueba una y cambia si sus compromisos no encajan.
Preguntas frecuentes
¿Es mejor Cabal o Stack? Ninguna es estrictamente mejor; se optimizan para cosas distintas. Cabal favorece versiones actualizadas de Hackage y una estrecha alineación con GHC; Stack favorece snapshots curados y reproducibles e instalaciones automáticas de GHC.
¿Stack y Cabal usan el mismo formato de paquete? Sí. Ambas leen el archivo .cabal del paquete. Stack añade stack.yaml encima; Cabal añade cabal.project.
¿Qué es un snapshot de Stackage? Un conjunto curado de versiones de paquetes de Hackage verificadas para compilar juntas, identificado por un resolver como lts-22.14. Fijar uno hace que las builds sean reproducibles.
¿Puedo cambiar de Stack a Cabal más adelante? Normalmente sí — el archivo .cabal es compartido, así que básicamente añades un cabal.project y proporcionas un GHC (mediante GHCup). Puede que los límites de versión necesiten un pequeño retoque.
¿Nuevo en el toolchain? Empieza por instalar Haskell con GHCup, que configura GHC, Cabal y Stack a la vez.
Compila Haskell más rápido
Tanto Stack como Cabal compilan más rápido con más núcleos y RAM que un portátil — útil para proyectos grandes y CI. Infomaniak, host suizo y respetuoso con la privacidad, ofrece VPS y servidores cloud para tus builds.
Ver el cloud de Infomaniak →Enlace de afiliado — apoya estas guías gratuitas.