devenv - Entornos de desarrollador Nix declarativos
devenv (de Cachix) construye entornos de desarrollador rápidos, declarativos, reproducibles y componibles usando Nix directamente. A diferencia de herramientas que ocultan Nix detrás de JSON, devenv abraza el lenguaje Nix para su configuración, lo que te da más poder y flexibilidad: lenguajes, paquetes, servicios (bases de datos, cachés), procesos de larga duración, scripts, variables de entorno y pre-commit/git hooks — todo definido en un único devenv.nix. Es la opción cuando quieres capacidad Nix completa con una capa amigable al desarrollador lista para usar.
Instalación
| Método | Comando |
|---|
| Requerimiento | Nix con flakes habilitados |
| Instalar | nix profile install nixpkgs#devenv (o a través de instrucciones de Cachix) |
| Cachix | recomendado para almacenamiento en caché binario rápido |
| Verificar | devenv version |
Primeros pasos
| Comando | Descripción |
|---|
devenv init | Estructura devenv.nix + devenv.yaml |
devenv shell | Ingresa en el entorno |
devenv up | Inicia procesos/servicios definidos |
devenv test | Ejecuta pruebas/controles configurados |
devenv update | Actualiza entradas (fija versiones más nuevas) |
devenv gc | Recolecta basura de viejos entornos |
La configuración (devenv.nix)
{ pkgs, ... }:
{
# Paquetes disponibles en el shell
packages = [ pkgs.git pkgs.jq ];
# Lenguajes (cadenas de herramientas gestionadas)
languages.javascript.enable = true;
languages.python = {
enable = true;
version = "3.12";
};
# Servicios
services.postgres.enable = true;
services.redis.enable = true;
# Variables de env
env.APP_ENV = "development";
# Scripts
scripts.hello.exec = "echo hello from devenv";
# Procesos de larga duración
processes.web.exec = "npm run dev";
# Git hooks (pre-commit)
pre-commit.hooks = {
prettier.enable = true;
ruff.enable = true;
};
}
Bloques de construcción clave
| Bloque | Propósito |
|---|
packages | Paquetes Nix arbitrarios en el shell |
languages.* | Soporte de lenguaje de primera clase (node, python, go, rust, …) |
services.* | Bases de datos/cachés (postgres, redis, mysql, mongodb, …) |
processes.* | Comandos de larga duración gestionados por devenv up |
scripts.* | Comandos nombrados ejecutables en el shell |
env.* | Variables de entorno |
pre-commit.hooks.* | Integraciones de pre-commit de git |
Servicios y procesos
| Comando | Descripción |
|---|
devenv up | Inicia todos los processes y services |
devenv up -d | Inicia en segundo plano |
devenv processes down | Detiene procesos |
services.postgres.enable = true; | Agrega un Postgres gestionado |
services.postgres.initialDatabases | Siembra bases de datos al iniciar |
Git Hooks (pre-commit)
devenv integra git hooks de pre-commit de manera declarativa — habilita un hook y se ejecuta en la confirmación.
| Ejemplo de hook | Se ejecuta |
|---|
prettier.enable | Formatea JS/TS/etc. |
ruff.enable | Linta Python |
nixpkgs-fmt.enable | Formatea Nix |
shellcheck.enable | Linta scripts de shell |
CI y contenedores
| Usar | Cómo |
|---|
| CI | devenv test / devenv shell -- <cmd> para envs idénticos |
| Contenedores | devenv container build produce imágenes OCI |
| direnv | .envrc con use devenv auto-ingresa al cd |
| Flakes | Componible con el ecosistema flake de Nix más amplio |
Flujos de trabajo comunes
# Env reproducible de stack completo: lenguaje + base de datos + proceso
devenv init
# edita devenv.nix: habilita python, services.postgres, processes.web
devenv shell # herramientas disponibles
devenv up # postgres + proceso web corriendo
# Construye un contenedor de la misma definición
devenv container build web
devenv vs Devbox vs Nix crudo
| Aspecto | devenv | Devbox | Nix (crudo) |
|---|
| Configuración | Lenguaje Nix | JSON | Lenguaje Nix |
| Poder | Alto (Nix completo) | Medio | Máximo |
| Servicios/procesos | Incorporado, rico | Servicios básicos | DIY |
| Curva de aprendizaje | Moderada (Nix) | Suave | Empinada |
| Mejor para | Envs declarativos poderosos | Envs reproducibles fáciles | Control total |
Si la sintaxis Nix es una barrera, Devbox ofrece una alternativa basada en JSON sobre la misma base; ver Nix para la base.
Recursos