Après 3 ans d’utilisation quotidienne d’asdf, j’ai franchi le pas : j’ai migré vers mise. La transition s’est faite en moins de 10 minutes, et je ne regrette pas. Voici pourquoi et comment.
Pourquoi j’utilisais asdf
asdf a été mon compagnon de route pendant des
années. Un seul outil pour gérer Node.js, Python, Terraform, kubectl… Le
fichier .tool-versions à la racine des projets garantissait que toute l’équipe
utilisait les mêmes versions.
nodejs 20.19.0direnv 2.37.1terraform 1.14.3kubectl 1.35.0trivy 0.68.2Le système fonctionnait bien, mais plusieurs irritants s’accumulaient :
- Lenteur au démarrage du shell : chaque
cddans un projet déclenchait des vérifications - Plugins non vérifiés : n’importe qui peut publier un plugin asdf qui exécute du code arbitraire
- Pas de gestion des variables d’environnement : obligé d’utiliser direnv en parallèle
- Pas de système de tasks : encore un outil de plus (Make, just, npm scripts…)
Pourquoi mise ?
mise (prononcé “MEEZ ahn plahs”) est une réécriture d’asdf en Rust par Jeff Dickey. Il résout tous mes irritants :
| Critère | asdf | mise |
|---|---|---|
| Performance | Scripts shell | Binaire Rust (~10x plus rapide) |
| Sécurité | Plugins tiers non vérifiés | Backend aqua avec signatures Cosign/SLSA |
| Variables d’env | Non (besoin de direnv) | Intégré dans mise.toml |
| Tasks | Non | Intégré (remplace Make/just) |
| Compatibilité | — | Lit .tool-versions nativement |
Le point crucial : mise lit les fichiers .tool-versions sans modification.
La migration est donc transparente.
Ma migration en 10 minutes
-
Installer mise
Fenêtre de terminal curl https://mise.run | sh# mise: installed successfully to /home/bob/.local/bin/mise -
Activer mise dans le shell
Fenêtre de terminal echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrcsource ~/.zshrc -
Vérifier que mise détecte mes outils
Fenêtre de terminal mise doctor# version: 2026.1.7 linux-x64# activated: yes# config_files:# ~/.tool-versions# ...# 18 problems found # Normal : les outils ne sont pas encore installés -
Installer tous les outils
Fenêtre de terminal mise install -y# mise act@0.2.84 ✓ installed# mise cosign@2.4.1 checksum cosign-linux-amd64# mise cosign@2.4.1 ✓ installed# mise terraform@1.14.3 ✓ installed# ...mise a automatiquement trouvé mon fichier
~/.tool-versionset installé les 17 outils qu’il contenait. -
Désactiver asdf
J’ai commenté les lignes asdf dans
~/.zshrc:Fenêtre de terminal # DISABLED: export PATH="${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"Et retiré
asdfde la liste des plugins oh-my-zsh. -
Vérifier que tout fonctionne
Fenêtre de terminal mise doctor# No problems found ✓mise current# node 20.19.0# terraform 1.14.3# kubectl 1.35.0# ...
C’est tout. Mes projets existants fonctionnent sans modification.
Ce qui change au quotidien
Performance perceptible
Le gain de performance est immédiat. Plus de latence quand je cd dans un
projet. mise utilise un binaire Rust compilé, pas des scripts shell.
Le backend aqua : la killer feature
C’est la fonctionnalité qui m’a convaincu de migrer. Laissez-moi vous expliquer ce qu’est aqua et pourquoi c’est important.
Qu’est-ce qu’aqua ?
Aqua est un projet open source créé par Shunsuke Suzuki. C’est un gestionnaire de versions déclaratif écrit en Go, avec une philosophie forte sur la sécurité et la reproductibilité.
Le cœur d’aqua est son Standard Registry : un dépôt GitHub (aquaproj/aqua-registry) contenant 2200+ définitions d’outils CLI 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 disponibles (Cosign, SLSA, minisign)
- Les binaires à exposer
Exemple de définition pour Terraform :
packages: - type: github_release repo_owner: hashicorp repo_name: terraform asset: terraform_{{.Version}}_{{.OS}}_{{.Arch}}.zip checksum: type: github_release asset: terraform_{{.Version}}_SHA256SUMSComment mise utilise aqua (sans installer aqua)
mise n’utilise pas le CLI aqua. Le registre aqua est compilé directement dans le binaire mise à chaque release. C’est ce qu’on appelle le “baked-in registry”.
mise doctor 2>&1 | grep "baked in"# aqua:# baked in registry tools: 2203Quand je fais mise use terraform, mise :
- Cherche
terraformdans son registre interne - Trouve
aqua:hashicorp/terraformcomme backend préféré - Télécharge le binaire depuis GitHub Releases
- Vérifie le checksum SHA256
- Si configuré, vérifie les signatures Cosign/SLSA
mise registry terraformmise préfère automatiquement aqua aux plugins asdf.
Pourquoi c’est mieux que les plugins asdf
Avec asdf, chaque plugin est un dépôt Git contenant des scripts shell exécutés lors de l’installation. N’importe qui peut publier un plugin qui exécute du code arbitraire sur votre machine.
Avec aqua :
| Aspect | Plugins asdf | Registre aqua |
|---|---|---|
| Format | Scripts shell | YAML déclaratif |
| Exécution de code | Oui (dangereux) | Non |
| Vérification checksums | Rare | Systématique |
| Signatures cryptographiques | Non | Cosign, SLSA, minisign |
| Maintenance | Fragmentée (1 repo/plugin) | Centralisée (1 registre) |
| Contributeurs | Variable | 186 contributeurs, CI stricte |
Vérifications de sécurité disponibles
mise implémente nativement (sans CLI externe) les vérifications suivantes :
- Checksums SHA256 : toujours activé, vérifie l’intégrité du fichier
- Cosign : signatures cryptographiques via Sigstore
- SLSA : provenance attestée du build (proof que le binaire vient d’un CI spécifique)
- GitHub Attestations : preuve que le binaire a été buildé par GitHub Actions
- Minisign : signatures avec minisign
# Configuration recommandée pour la CI/CDexport MISE_AQUA_COSIGN=trueexport MISE_AQUA_SLSA=trueexport MISE_AQUA_GITHUB_ATTESTATIONS=trueOu dans ~/.config/mise/config.toml :
[settings.aqua]cosign = trueslsa = truegithub_attestations = trueVariables d’environnement intégrées
Je n’ai plus besoin de direnv. mise gère tout :
[tools]node = "22"python = "3.12"
[env]NODE_ENV = "development"DATABASE_URL = "postgres://localhost/mydb"
# Charger un fichier .env_.file = ".env"Tasks : adieu Makefile
La fonctionnalité que j’utilise le plus maintenant. Mes tasks de développement
sont dans mise.toml :
[tasks.dev]run = "npm run dev"description = "Lance le serveur de développement"
[tasks.test]run = "npm test"depends = ["lint"]
[tasks.lint]run = "eslint src/"
[tasks.ci]depends = ["lint", "test", "build"]mise run devmise run ci # Exécute lint, test, build en parallèlemise tasks # Liste toutes les tasksLes tasks supportent :
- Dépendances entre tasks
- Exécution parallèle (4 jobs par défaut)
- Skip automatique si les fichiers n’ont pas changé (
sources/outputs) - Watch mode :
mise watch build
Les petits plus
Mise à jour des outils
# Voir les outils outdatedmise outdated# node 20.19.0 → 22.13.1# terraform 1.14.3 → 1.15.0
# Mettre à jourmise upgrade --bumpLockfile pour la reproductibilité
mise génère un mise.lock qui pin les versions exactes + checksums.
Parfait pour la CI/CD.
Support Windows natif
Contrairement à asdf (Unix only), mise fonctionne sur Windows.
Ce que je n’ai pas migré
Je garde asdf installé (mais désactivé) pour deux raisons :
- Certains plugins spécifiques n’ont pas d’équivalent aqua/github
- Rollback facile si jamais je rencontre un problème
Mais honnêtement, après un mois d’utilisation, je n’ai pas eu besoin de revenir en arrière.
Conclusion
La migration d’asdf vers mise est l’une des meilleures décisions que j’ai prises pour mon environnement de développement. Le gain de temps quotidien (performance
- tasks intégrées) et la sécurité améliorée (backend aqua) valent largement les 10 minutes d’installation.
Si vous utilisez asdf, essayez mise. Vos fichiers .tool-versions fonctionneront
immédiatement, et vous pourrez migrer progressivement vers mise.toml quand
vous serez prêt.
Ressources :
- Guide complet mise sur ce blog
- Guide asdf (pour comprendre d’où je viens)
- Site officiel mise
- Comparaison asdf vs mise