03. II. Dependencias
03. II. Dependencias
Declara explícitamente y aísla las dependencias.
La regla
Una aplicación twelve-factor nunca depende de la existencia implícita de paquetes instalados a nivel de sistema operativo. Todas las dependencias se declaran, completa y exactamente, mediante un manifiesto de dependencias.
Esto se logra con dos prácticas complementarias:
- Declaración: un archivo de manifiesto lista cada librería que la app necesita, idealmente con versión fijada.
- Aislamiento: una herramienta garantiza que, al ejecutar la app, sólo se usan las dependencias declaradas — nunca librerías “que ya estaban” en el sistema.
Herramientas por lenguaje
| Lenguaje | Declaración | Aislamiento |
|---|---|---|
| Ruby | Gemfile (Bundler) | bundle exec |
| Python | requirements.txt / pyproject.toml (Pip) | Virtualenv / venv |
| Node.js / Bun | package.json | node_modules local (ya aislado por diseño) |
| C | Autoconf | Enlace estático |
| Clojure | Leiningen | — |
El patrón se repite: un manifiesto + un entorno aislado, sin importar el lenguaje.
Por qué importa: onboarding y reproducibilidad
Cuando las dependencias están bien declaradas y aisladas, incorporar a alguien nuevo al proyecto se reduce a:
git clone <repo>
<gestor-de-paquetes> install
Sin pasos manuales tipo “primero instalá esta versión de ImageMagick en tu sistema” o “acordate de tener PostgreSQL 14 exacto porque si no explota”. Si esos pasos existen, es una señal de que hay dependencias implícitas sin declarar.
Herramientas del sistema también son dependencias
El factor también aplica a herramientas de línea de comandos que la app invoca como subproceso: curl, ImageMagick, wkhtmltopdf, etc. Si son imprescindibles, deben empaquetarse junto con la aplicación (por ejemplo, dentro de la imagen de contenedor), no asumirse como preinstaladas en el host de producción — porque en desarrollo probablemente sí lo estén, generando una divergencia silenciosa (ver Factor X, Paridad dev/prod).
Checklist del factor II
- Existe un manifiesto de dependencias versionado junto al código (no generado ad-hoc).
- Un clon limpio del repo + un único comando de instalación deja el entorno funcional.
- Ninguna herramienta de sistema invocada por la app se asume “preinstalada” sin declararla o empaquetarla.
- El entorno de ejecución está aislado (virtualenv, contenedor,
node_moduleslocal) del resto del sistema operativo.
Con el código versionado (I) y las dependencias resueltas (II), el siguiente paso es separar lo que varía entre entornos: la configuración.