mise-en-place: Una herramienta para gestionar dev tools fácilmente
Un reemplazo todo en uno para pyenv, nvm, direnv y más
lunes, 13 de abril de 2026 11:03 UTC-04:00
Cuando trabajamos en desarrollo de software, usamos diferentes herramientas. Runtimes, compiladores, task runners, etc. Y todo el que trabaje en nuestro proyecto debe tener estas herramientas. Pero hay unos inconvenientes:
-
Algunas herramientas no son tan fáciles de instalar para ciertos desarrolladores, en particular los que usan Windows (ya que la mayoría de devtools se centran más en Linux).
-
A veces, hay que mantener múltiples versiones para diferentes proyectos, por ejemplo, Python 3.11 para uno, 3.12 para otro, etc. También pasa con NodeJS.
-
Hay que mantener variables de entorno, y a veces, un
.envno es suficiente
Pero he aquí la solución: mise
mise-en-place (o simplemente mise) es una herramienta
todo en uno para gestionar entornos de desarrollo, ya sea Python, web, entre
muchos otros. También gestiona variables de entorno tal como direnv (¡y
funciona en Windows sin WSL!) e incluso gestiona comandos comunes (para
desarrollo, compilación o testing), tal como make o los scripts de npm.
Empezando con mise
Para empezar, deberás instalar mise. Hay varios métodos:
-
En Windows: Instala scoop. Luego en PowerShell:
scoop install mise -
En Mac: Usa Homebrew:
brew install mise -
En Linux:
# Arch y derivados sudo pacman -S mise # Debian/Ubuntu y derivados sudo apt update -y && sudo apt install -y curl sudo install -dm 755 /etc/apt/keyrings curl -fSs https://mise.jdx.dev/gpg-key.pub | sudo tee /etc/apt/keyrings/mise-archive-keyring.asc 1> /dev/null echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.asc] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list sudo apt update -y sudo apt install -y mise # Fedora/RHEL y derivados sudo dnf copr enable jdxcode/mise sudo dnf install mise # Otras distros curl https://mise.run | sh
Ahora, opcional pero recomendablemente, puedes activar el entorno para poder
usar los programas instalados por mise donde quieras.
El proceso depende de tu shell:
-
Bash: Agrega a ~/.bashrc
eval "$(mise activate bash)" -
Zsh: Agrega a ~/.zshrc
eval "$(mise activate zsh)" -
Fish: Agrega a
~/.config/fish/config.fishmise activate fish | source -
PowerShell: Agrega a
$PROFILE(&mise activate pwsh) | Out-String | Invoke-Expression
Ahora, vamos a la siguiente parte.
Usando mise
Usar mise es muy sencillo. Veamos un ejemplo: Para un curso de desarrollo full
stack, tengo que hacer varios proyectos con Node.js. Afortunadamente, es fácil
de instalar con mise, yendo al directorio del proyecto y corriendo esto:
mise use node@24
La sintaxis básica de mise use es mise use <herramienta>@<versión>. En este
caso node y la última versión LTS (de versión mayor par) de Node.js, la número
24 al momento de escribir esto.
Si solo quieres correr un comando con esa herramienta, sin activarla, puedes
usar mise exec (o mise x):
mise exec node@24 -- node -v
También puedes instalar gestores alternativos (como pnpm), o incluso, runtimes alternativos como Deno o Bun.
Y no está limitado a herramientas de desarrollo web, también puedes instalar muchas otras cosas:
# Python
mise use python
# Ruby
mise use ruby
# Go
mise use go
Y cientos de herramientas más.
El archivo mise.toml
La configuración de Mise se hace en un archivo llamado mise.toml. Cuando usas
mise use, este archivo se crea automáticamente, y contiene más o menos esto:
[tools]
node = '24'
Esto, asumiendo que corriste el comando mise use node@24 que vimos
anteriormente.
¿Recuerdas que anteriormente dije que puedes usar mise para gestionar comandos
comunes? Esto también se hace con el archivo mise.toml. Por ejemplo, en un
típico proyecto de Vite:
[tasks.dev]
description = "Corre el servidor de desarrollo"
run = ["npm run dev"]
Ahora, puedes empezar el servidor de desarrollo con mise run dev
Aquí hay un ejemplo simple pero más o menos completo, extraído de mi proyecto de React para el curso:
[tools]
biome = "latest" # Linter para web
pnpm = "latest" # Gestor de paquetes alternativo
[tasks.dev]
description = "Arranca el servidor dev"
run = "pnpm dev"
[tasks.lint]
description = "Lintea los archivos"
run = "biome lint ."