Mise : gérer les versions de Node, Python, Ruby et Go par projet

Chaque projet a ses contraintes : Node 20 ici, Node 22 là, Python 3.11 pour ce script, 3.12 pour l’autre. Gérer ça avec nvm, pyenv, rbenv et gvm séparément est ingérable. Mise installe et switche automatiquement les versions de tous ces outils depuis un seul binaire et un seul fichier de configuration par projet.

Ce que fait Mise

Mise (prononcé “meez”) est un gestionnaire de versions d’outils de développement. Il remplace nvm (Node), pyenv (Python), rbenv (Ruby), goenv (Go), sdkman (Java) et asdf par un seul outil. Il lit un fichier .mise.toml dans chaque répertoire et active automatiquement les bonnes versions à l’entrée dans le dossier.

Installation

# macOS / Linux (script officiel)
curl https://mise.run | sh

# macOS (Homebrew)
brew install mise

# Windows (PowerShell)
winget install jdx.mise

# Cargo
cargo install mise

Activez l’intégration shell (une seule fois) :

# Bash
echo 'eval "$(mise activate bash)"' >> ~/.bashrc

# Zsh
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

# Fish
echo 'mise activate fish | source' >> ~/.config/fish/config.fish

Configuration par projet

Créez un fichier .mise.toml à la racine de votre projet :

[tools]
node    = "22"
python  = "3.12"

Mise installe ces versions si elles ne sont pas présentes, et les active automatiquement quand vous entrez dans le répertoire.

cd mon-projet
# → mise active automatiquement node 22 et python 3.12
node --version   # v22.x.x
python --version # Python 3.12.x

cd ..
node --version   # retour à la version globale

Versions disponibles

# Lister les versions disponibles pour un outil
mise ls-remote node
mise ls-remote python
mise ls-remote ruby
mise ls-remote go

# Raccourcis : "latest", "lts", numéros partiels
[tools]
node   = "lts"     # dernière LTS
node   = "22"      # dernière 22.x.x
node   = "22.11"   # dernière 22.11.x
node   = "22.11.0" # version exacte

Outils supportés

Mise supporte des centaines d’outils via le registre intégré et les backends asdf/aqua :

[tools]
node       = "22"
python     = "3.12"
ruby       = "3.3"
go         = "1.22"
java       = "temurin-21"
rust       = "stable"
terraform  = "1.7"
kubectl    = "1.29"
helm       = "3.14"
bun        = "latest"
deno       = "latest"
pnpm       = "9"
poetry     = "latest"
# Lister tous les outils disponibles
mise registry

Commandes principales

# Installer les outils définis dans .mise.toml
mise install

# Installer une version spécifique globalement
mise use --global node@22

# Voir les versions actives
mise current

# Lister les versions installées
mise ls

# Mise à jour vers la dernière version d'un outil
mise upgrade node

# Désinstaller une version
mise uninstall node@20.0.0

# Exécuter une commande avec une version spécifique
mise exec node@18 -- node script.js

Configuration globale

# ~/.config/mise/config.toml (ou ~/.mise.toml)
[tools]
node   = "22"    # version par défaut globale
python = "3.12"

Les projets sans .mise.toml utilisent ces versions globales.

Compatibilité avec les fichiers existants

Mise lit aussi les fichiers de configuration des autres outils :

.node-version      # nvm / nodenv
.nvmrc             # nvm
.python-version    # pyenv
.ruby-version      # rbenv
.tool-versions     # asdf (format hérité)

Migration depuis asdf : aucune modification requise, mise lit les .tool-versions existants.

Variables d’environnement par projet

.mise.toml peut aussi définir des variables d’environnement spécifiques au projet :

[tools]
node = "22"

[env]
NODE_ENV = "development"
DATABASE_URL = "postgresql://localhost/mon_projet_dev"
API_PORT = "3000"

Ces variables sont injectées automatiquement à l’entrée dans le répertoire, et retirées à la sortie. Fonctionne comme direnv pour les variables.

Tâches (tasks)

Mise intègre un runner de tâches simple :

[tasks.dev]
run  = "npm run dev"
description = "Démarrer le serveur de développement"

[tasks.test]
run  = "npm test"
depends = ["build"]

[tasks.build]
run  = "npm run build"

[tasks.deploy]
run  = """
npm run build
rsync -avz dist/ user@serveur:/var/www/
"""
mise run dev
mise run test
mise run deploy

Hooks d’installation

[tools.python]
version = "3.12"

# Exécuter après l'installation de Python
[hooks]
post_install = "pip install -r requirements.txt"

Intégration CI/CD

# .github/workflows/ci.yml
- name: Setup tools
  uses: jdx/mise-action@v2
  # Lit automatiquement .mise.toml et installe les outils

- name: Install dependencies
  run: npm ci
# GitLab CI
before_script:
  - curl https://mise.run | sh
  - eval "$(mise activate bash)"
  - mise install

+ Les points forts

  • Un seul outil — remplace nvm, pyenv, rbenv, goenv, asdf. Une seule commande à apprendre
  • Configuration déclarative.mise.toml versionné dans git, reproductibilité garantie entre développeurs
  • Changement automatique — pas de nvm use, pas de pyenv local. Mise switche en entrant dans le répertoire
  • Variables d’environnement par projet — remplace aussi direnv pour les variables simples
  • Très rapide — écrit en Rust, l’activation du shell est quasi-instantanée

- Les points faibles

  • Moins mature qu’asdf — asdf a des années d’écosystème et de plugins. Quelques outils très spécifiques ne sont disponibles que via asdf
  • Activation shell requise — le changement automatique nécessite l’initialisation dans le profil shell. Dans les scripts non-interactifs, il faut appeler mise exec ou mise run
  • Pas de support Windows natif complet — mise fonctionne sur Windows mais le support est moins complet qu’en Linux/macOS (WSL2 recommandé)

Mise vs concurrents

Misenvm+pyenvasdfvolta
Multi-langagesPartielNode uniquement
Config déclarative.nvmrc.tool-versionspackage.json
Variables d’env
Runner de tâches
Vitesse⚡⚡⚡⚡⚡⚡⚡⚡

En résumé

Mise résout définitivement le problème des versions d’outils en équipe. Un .mise.toml commité dans le repo garantit que tous les développeurs utilisent les mêmes versions sans procédure d’installation manuelle. Le remplacement de nvm, pyenv et rbenv par un seul outil réduit aussi considérablement la complexité de l’environnement de développement.


Voir aussi :

  • Scoop — installer les outils Windows sans droits admin
  • Taskfile — définir les tâches du projet dans un fichier YAML versionné