Aller au contenu
Outils medium

mise : le gestionnaire de versions polyvalent et rapide

28 min de lecture

logo mise

mise (prononcé “MEEZ ahn plahs”) fait tout ce que fait asdf, mais en mieux. Écrit en Rust, mise installe vos outils de développement (Node.js, Python, Go, Terraform…), gère vos variables d’environnement par projet, et exécute des tasks — le tout avec une seule commande. Compatible avec les fichiers .tool-versions d’asdf, mise offre des performances 10x supérieures, une meilleure sécurité supply chain, et des fonctionnalités absentes d’asdf comme les backends npm/pipx et la gestion d’environnements.

  • Comprendre les avantages de mise vs asdf (performance, sécurité, fonctionnalités)
  • Installer mise sur Linux, macOS et Windows
  • Gérer vos outils avec les backends (core, aqua, npm, pipx, github)
  • Configurer des environnements par projet avec mise.toml
  • Créer et exécuter des tasks pour automatiser votre workflow
  • Migrer depuis asdf en conservant vos fichiers .tool-versions
Critèremiseasdf
Performance~5ms au changement de répertoire~120ms par appel via shim
LangageRust (binaire unique)Bash / Go (0.16+)
Windows✅ Supporté❌ Non supporté
SécuritéBackends vérifiés (Cosign, SLSA)Plugins tiers non vérifiés
Tasks✅ Intégrés❌ Absent
Environnements✅ Variables par projet❌ Absent
Backendscore, aqua, npm, pipx, cargo, githubPlugins uniquement

Architecture mise : CLI, dev tools, environnements, tasks et backends

mise est organisé autour de quatre piliers :

PilierDescriptionConfiguration
Dev ToolsGestion des versions d’outils[tools]
EnvironmentsVariables d’environnement par projet[env]
TasksScripts automatisés[tasks]
BackendsSources d’installation (core, aqua, npm…)Automatique

Où sont stockées les données ?

~/.local/share/mise/
├── installs/ # Outils installés
│ ├── node/
│ │ └── 22.13.1/
│ └── python/
│ └── 3.12.8/
├── shims/ # Shims (optionnel)
└── plugins/ # Plugins asdf (legacy)
~/.config/mise/
└── config.toml # Configuration globale
  1. Installer mise

    Fenêtre de terminal
    curl https://mise.run | sh

    Le binaire est installé dans ~/.local/bin/mise.

  2. Activer mise dans votre shell (Bash)

    Fenêtre de terminal
    echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
    source ~/.bashrc
  3. Activer mise dans votre shell (Zsh)

    Fenêtre de terminal
    echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
    source ~/.zshrc
  4. Vérifier l’installation

    Fenêtre de terminal
    mise --version
    mise doctor
Fenêtre de terminal
# Installer un outil (ajoute à mise.toml)
mise use node@22
mise use python@3.12
# Installer globalement (pour tout le système)
mise use -g node@22
# Installer sans modifier mise.toml
mise install node@22
# Exécuter une commande avec un outil spécifique
mise exec node@20 -- node -v
# Raccourci pour mise exec
mise x python@3.11 -- python --version
Fenêtre de terminal
# Lister les outils installés
mise list
# Voir les versions disponibles
mise list-all node | tail -10
# Mettre à jour tous les outils
mise upgrade
# Mettre à jour et bumper les versions dans mise.toml
mise upgrade --bump
Fenêtre de terminal
# Voir la configuration active
mise current
# Voir les fichiers de config chargés
mise config
# Voir les détails d'un outil
mise tool node

Le fichier mise.toml remplace .tool-versions avec plus de fonctionnalités :

mise.toml
# Versions d'outils
[tools]
node = "22"
python = "3.12"
terraform = "1.9"
# Variables d'environnement
[env]
NODE_ENV = "development"
DATABASE_URL = "postgres://localhost/mydb"
# Tasks (scripts)
[tasks.dev]
run = "npm run dev"
description = "Démarre le serveur de développement"
[tasks.test]
run = "npm test"
depends = ["lint"]
[tasks.lint]
run = "npm run lint"

Hiérarchie des fichiers de configuration :

projet/
├── mise.local.toml # Surcharges locales (git-ignored)
├── mise.toml # Config partagée avec l'équipe
└── backend/
└── mise.toml # Config spécifique au sous-dossier

mise peut installer des outils depuis 17 backends différents. Chaque backend est un gestionnaire de paquets ou un écosystème que mise sait utiliser.

BackendUsageExemple
coreOutils intégrés (node, python, go…)mise use node@22
aquaRegistry aqua (2200+ outils vérifiés)mise use aqua:hashicorp/terraform
githubBinaires GitHub Releasesmise use github:BurntSushi/ripgrep
gitlabBinaires GitLab Releasesmise use gitlab:gitlab-org/cli
npmPaquets npm globauxmise use npm:prettier@3
pipxPaquets Python CLI (isolés)mise use pipx:black
cargoCrates Rust (compilation)mise use cargo:ripgrep
goPaquets Go (compilation)mise use go:github.com/go-task/task
gemGems Rubymise use gem:rails
asdfPlugins asdf (legacy)mise use asdf:ruby@3.3
vfoxPlugins vfoxmise use vfox:mise-plugins/vfox-php
httpTéléchargement directmise use http:dart

Aqua est le backend recommandé pour la plupart des outils CLI. Il offre :

  • 2200+ outils disponibles sans plugins
  • Vérification automatique des signatures (Cosign, SLSA, minisign)
  • Attestations GitHub pour prouver l’origine du build
  • Support Windows natif
  • Registre intégré dans le binaire mise (pas de téléchargement)

Aqua est un projet open source créé par Shunsuke Suzuki. C’est un gestionnaire de versions déclaratif écrit en Go, avec un focus fort sur la sécurité et la reproductibilité.

Le cœur d’aqua est son Standard Registry (aquaproj/aqua-registry) : un dépôt contenant 2200+ définitions d’outils sous forme de fichiers YAML. Chaque définition décrit :

  • L’URL de téléchargement pour chaque OS/architecture
  • Le checksum SHA256 attendu
  • Les méthodes de vérification cryptographique (Cosign, SLSA, minisign)
  • Les binaires à exposer sur le PATH

Exemple de définition (simplifié) :

pkgs/hashicorp/terraform/registry.yaml
packages:
- type: github_release
repo_owner: hashicorp
repo_name: terraform
asset: terraform_{{.Version}}_{{.OS}}_{{.Arch}}.zip
checksum:
type: github_release
asset: terraform_{{.Version}}_SHA256SUMS

mise n’utilise pas le CLI aqua. Le registre aqua est compilé directement dans le binaire mise à chaque release (“baked-in registry”). mise a sa propre implémentation en Rust qui sait lire ces définitions YAML.

Fenêtre de terminal
# Voir les backends disponibles
mise backends ls
# aqua, asdf, cargo, conda, core, dotnet, forgejo, gem, github,
# gitlab, go, npm, pipx, spm, http, s3, ubi, vfox
# Voir les sources disponibles pour un outil
mise registry kubectl
# aqua:kubernetes/kubernetes/kubectl asdf:asdf-community/asdf-kubectl
mise registry terraform
# aqua:hashicorp/terraform asdf:mise-plugins/mise-hashicorp vfox:mise-plugins/vfox-terraform

Quand vous faites mise use terraform, mise :

  1. Cherche terraform dans son registre interne
  2. Trouve aqua:hashicorp/terraform comme backend préféré
  3. Télécharge le binaire depuis GitHub Releases
  4. Vérifie le checksum SHA256
  5. Si configuré, vérifie les signatures Cosign/SLSA/GitHub Attestations
Fenêtre de terminal
# Vérifier les outils aqua disponibles (2203 outils)
mise doctor 2>&1 | grep "baked in"
# aqua:
# baked in registry tools: 2203
AspectPlugins asdfRegistre aqua
FormatScripts shellYAML déclaratif
Exécution de codeOui (dangereux)Non
Vérification checksumsRareSystématique
Signatures cryptographiquesNonCosign, SLSA, minisign
MaintenanceFragmentée (1 repo/plugin)Centralisée (186 contributeurs)
Fenêtre de terminal
# Installer ripgrep via aqua (vérification automatique)
mise use -g ripgrep
# mise ripgrep@15.1.0 ✓ installed
# Installer kubectl via aqua
mise use -g kubectl
# mise kubectl@1.35.0 checksum kubectl
# mise kubectl@1.35.0 extract kubectl
# mise kubectl@1.35.0 ✓ installed
# CLI npm sans polluer node_modules
mise use -g npm:prettier@3
mise use -g npm:@anthropic-ai/claude-code
# Outils Python CLI isolés avec pipx
mise use -g pipx:black
mise use -g pipx:ansible
# Binaires depuis GitHub (quand pas dans aqua)
mise use -g github:junegunn/fzf
mise use -g github:sharkdp/bat
# GitLab CLI depuis GitLab
mise use -g gitlab:gitlab-org/cli

Quand un outil est disponible dans plusieurs backends, mise utilise une priorité :

  1. aqua — préféré pour la sécurité et les performances
  2. github / gitlab — pour les outils non disponibles dans aqua
  3. asdf — uniquement si nécessaire (plugins tiers non vérifiés)

Vous pouvez forcer un backend spécifique :

Fenêtre de terminal
# Forcer le backend aqua
mise use aqua:hashicorp/terraform
# Forcer le backend asdf (si plugin spécifique nécessaire)
mise use asdf:ruby@3.3

Par défaut, mise active la vérification de checksums. Vous pouvez renforcer la sécurité en activant les vérifications cryptographiques :

~/.config/mise/config.toml
[settings.aqua]
# Vérification Cosign (signatures sigstore)
cosign = true
# Vérification SLSA (provenance des builds)
slsa = true
# Attestations GitHub Actions
github_attestations = true

Ou par variables d’environnement (utile en CI/CD) :

Fenêtre de terminal
export MISE_AQUA_COSIGN=true
export MISE_AQUA_SLSA=true
export MISE_AQUA_GITHUB_ATTESTATIONS=true

mise peut définir des variables d’environnement par projet :

mise.toml
[env]
# Variables simples
NODE_ENV = "development"
PORT = "3000"
# Charger depuis un fichier .env
_.file = ".env"
# Variables conditionnelles par environnement
[env.production]
NODE_ENV = "production"
DEBUG = "false"

Environnements multiples :

Fenêtre de terminal
# Créer un fichier mise.production.toml
# Activer avec MISE_ENV
MISE_ENV=production mise exec -- node server.js

Les tasks de mise remplacent les scripts npm, Makefile, ou just avec des avantages uniques :

  • Exécution parallèle par défaut (4 jobs simultanés)
  • Skip automatique si les fichiers n’ont pas changé (sources/outputs)
  • Watch mode intégré pour rebuild automatique
  • Dépendances entre tasks avec exécution intelligente
  • Scripts en fichiers avec coloration syntaxique dans l’éditeur

Deux façons de définir des tasks : en TOML (simple) ou en fichiers (complexe).

mise.toml
# Syntaxe courte pour les tasks simples
[tasks]
build = "cargo build"
test = "cargo test"
lint = "cargo clippy"
# Syntaxe détaillée avec options
[tasks.dev]
run = "npm run dev"
description = "Lance le serveur de développement"
[tasks.build]
run = "cargo build"
description = "Compile le projet"
alias = "b" # mise run b
sources = ["Cargo.toml", "src/**/*.rs"]
outputs = ["target/debug/mycli"]

Cas d’usage : workflow de développement complet

Section intitulée « Cas d’usage : workflow de développement complet »
mise.toml
[tools]
node = "22"
python = "3.12"
[env]
NODE_ENV = "development"
# === TASKS DE BUILD ===
[tasks.build]
description = "Build l'application"
run = "npm run build"
sources = ["src/**/*.ts", "package.json"]
outputs = ["dist/**"]
[tasks."build:watch"]
description = "Build en mode watch"
run = "npm run build -- --watch"
# === TASKS DE TEST ===
[tasks.test]
description = "Lance les tests unitaires"
run = "npm test"
depends = ["lint"] # lint avant test
env = { NODE_ENV = "test" }
[tasks."test:e2e"]
description = "Lance les tests end-to-end"
run = ["npm run build", "./scripts/test-e2e.sh"]
depends = ["build"]
[tasks."test:coverage"]
run = "npm test -- --coverage"
# === TASKS DE QUALITÉ ===
[tasks.lint]
description = "Vérifie le code avec ESLint"
run = "eslint src/"
sources = ["src/**/*.ts", ".eslintrc.*"]
[tasks."lint:fix"]
run = "eslint src/ --fix"
[tasks.format]
run = "prettier --write src/"
# === TASK COMBINÉE ===
[tasks.ci]
description = "Pipeline CI complet"
depends = ["lint", "test", "build"]
# === DÉPLOIEMENT ===
[tasks.deploy]
description = "Déploie en production"
confirm = "Êtes-vous sûr de vouloir déployer ?"
run = """
npm run build
rsync -avz dist/ server:/var/www/
"""
depends = ["test"]
Fenêtre de terminal
# Exécuter une task
mise run build
mise run test
# Raccourci (si pas de conflit avec une commande mise)
mise build
mise test
# Exécuter plusieurs tasks en parallèle
mise run lint test build
# Passer des arguments (passés à la dernière commande)
mise run build --release
# Séparer les arguments entre tasks
mise run build --release ::: test --verbose
# Mode watch (relance sur changement)
mise watch build
# Lister les tasks disponibles
mise tasks
# Name Description Source
# build Build l'application mise.toml
# test Lance les tests unitaires mise.toml
# lint Vérifie le code avec ESLint mise.toml
# ci Pipeline CI complet mise.toml

Le système sources/outputs évite les rebuilds inutiles :

mise.toml
[tasks.build]
run = "cargo build"
sources = ["Cargo.toml", "src/**/*.rs"]
outputs = ["target/debug/mycli"]

Si target/debug/mycli est plus récent que tous les fichiers sources, la task est skippée. Particulièrement utile en CI/CD pour économiser du temps.

Les tasks peuvent utiliser n’importe quel interpréteur via shebang :

mise.toml
[tools]
python = "3.12"
[tasks.migrate]
description = "Exécute les migrations Django"
run = '''
#!/usr/bin/env python
import subprocess
subprocess.run(["python", "manage.py", "migrate"])
print("Migrations terminées !")
'''

Organisez les tasks par préfixe pour les monorepos :

mise.toml
# Frontend
[tasks."frontend:dev"]
run = "cd frontend && npm run dev"
[tasks."frontend:build"]
run = "cd frontend && npm run build"
[tasks."frontend:test"]
run = "cd frontend && npm test"
# Backend
[tasks."backend:dev"]
run = "cd backend && cargo run"
[tasks."backend:build"]
run = "cd backend && cargo build --release"
[tasks."backend:test"]
run = "cd backend && cargo test"
# Exécuter tous les tests avec wildcard
[tasks.test]
depends = ["*:test"] # frontend:test + backend:test
# Ou avec pattern plus précis
[tasks."lint:all"]
depends = ["lint:*"] # lint:eslint + lint:clippy + ...
Fenêtre de terminal
# Exécuter un groupe
mise run frontend:dev
mise run backend:test
# Exécuter tous les tests (wildcard)
mise run test
mise.toml
# Script local dans un fichier séparé
[tasks.release]
description = "Créer une release"
file = "scripts/release.sh"
confirm = "Créer une nouvelle release ?"
# Script distant (avec cache)
[tasks.setup]
description = "Configure l'environnement de dev"
file = "https://raw.githubusercontent.com/mon-org/scripts/main/setup.sh"

mise injecte automatiquement des variables utiles :

VariableDescription
MISE_ORIGINAL_CWDRépertoire depuis lequel la commande a été lancée
MISE_CONFIG_ROOTRépertoire contenant le mise.toml
MISE_PROJECT_ROOTRacine du projet
MISE_TASK_NAMENom de la task en cours
MISE_TASK_FILEChemin complet vers le script de la task

mise lit nativement les fichiers .tool-versions. La migration est transparente.

  1. Installer mise

    Fenêtre de terminal
    curl https://mise.run | sh
    echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
    source ~/.zshrc
  2. Vos fichiers .tool-versions fonctionnent immédiatement

    Fenêtre de terminal
    cd mon-projet-asdf
    mise install # Installe tout depuis .tool-versions
    mise current # Vérifie les versions

    mise convertit automatiquement les outils asdf vers les backends optimaux (aqua, github, gitlab) :

    nektos/act
    # Exemple de conversion automatique
    mise ls
    # Tool Version Source Requested
    # kubectl 1.35.0 ~/.tool-versions 1.35.0 # → aqua:kubernetes/kubernetes/kubectl
    # glab 1.80.4 ~/.tool-versions 1.80.4 # → gitlab:gitlab-org/cli
    # node 20.19.0 ~/.tool-versions 20.19.0 # → core:node
  3. Désactiver asdf dans votre shell

    Commentez les lignes asdf dans ~/.bashrc ou ~/.zshrc :

    Fenêtre de terminal
    # Avant
    export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"
    # Après
    # DISABLED: export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"

    Retirez asdf de la liste des plugins oh-my-zsh si présent.

  4. Vérifier que mise fonctionne

    Fenêtre de terminal
    mise doctor
    # version: 2026.1.7 linux-x64
    # activated: yes
    # ...
    # ✓ No problems found
  5. Optionnel : convertir en mise.toml

    Fenêtre de terminal
    # Créer mise.toml depuis les versions actuelles
    mise use node@22 python@3.12 terraform@latest
mise.toml
[hooks]
enter = "mise install --quiet"
Fenêtre de terminal
# Créer un lockfile avec checksums
touch mise.lock
mise install
# mise.lock contient maintenant les versions exactes et checksums
Fenêtre de terminal
# Dans ~/.bashrc ou ~/.zshrc
alias mx="mise exec --"
alias mr="mise run"
alias mi="mise install"
alias mu="mise use"
.github/workflows/ci.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: jdx/mise-action@v2
- run: node -v # Version depuis mise.toml
Fenêtre de terminal
# Définir un token GitHub
export MISE_GITHUB_TOKEN="ghp_..."
# Ou utiliser le lockfile (stocke les URLs)
touch mise.lock && mise install
Fenêtre de terminal
# Vérifier que mise est dans le PATH
echo $PATH | tr ':' '\n' | grep local
# Ajouter manuellement si nécessaire
export PATH="$HOME/.local/bin:$PATH"
Fenêtre de terminal
# Faire confiance au répertoire
mise trust
# Ou ajouter à la config globale
mise settings trusted_config_paths "~/projets"
Fenêtre de terminal
# Régénérer les shims
mise reshim
# Ou recharger le shell
exec $SHELL
Fenêtre de terminal
mise cache clear
ActionCommande
Installer un outilmise use node@22
Installer globalementmise use -g python@3.12
Exécuter avec un outilmise exec node@20 -- node -v
Lancer une taskmise run test
Voir la configmise config
Mettre à jour toutmise upgrade --bump

Points clés :

  • Plus rapide et plus sécurisé qu’asdf
  • mise.toml combine outils, environnements et tasks
  • Backends multiples : npm, pipx, cargo, github, aqua
  • Compatible avec .tool-versions d’asdf
  • Supporte Windows