Aller au contenu
medium

J'ai migré d'asdf vers mise : retour d'expérience

10 min de lecture

logo mise

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.

~/.tool-versions
nodejs 20.19.0
direnv 2.37.1
terraform 1.14.3
kubectl 1.35.0
trivy 0.68.2

Le système fonctionnait bien, mais plusieurs irritants s’accumulaient :

  • Lenteur au démarrage du shell : chaque cd dans 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èreasdfmise
PerformanceScripts shellBinaire Rust (~10x plus rapide)
SécuritéPlugins tiers non vérifiésBackend aqua avec signatures Cosign/SLSA
Variables d’envNon (besoin de direnv)Intégré dans mise.toml
TasksNonInté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

  1. Installer mise

    Fenêtre de terminal
    curl https://mise.run | sh
    # mise: installed successfully to /home/bob/.local/bin/mise
  2. Activer mise dans le shell

    Fenêtre de terminal
    echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
    source ~/.zshrc
  3. 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
  4. 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-versions et installé les 17 outils qu’il contenait.

  5. 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é asdf de la liste des plugins oh-my-zsh.

  6. 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 :

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

Comment 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”.

Fenêtre de terminal
mise doctor 2>&1 | grep "baked in"
# aqua:
# baked in registry tools: 2203

Quand je fais 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
mise-plugins/vfox-terraform
mise registry terraform

mise 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 :

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 (1 registre)
ContributeursVariable186 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
Fenêtre de terminal
# Configuration recommandée pour la CI/CD
export MISE_AQUA_COSIGN=true
export MISE_AQUA_SLSA=true
export MISE_AQUA_GITHUB_ATTESTATIONS=true

Ou dans ~/.config/mise/config.toml :

[settings.aqua]
cosign = true
slsa = true
github_attestations = true

Variables d’environnement intégrées

Je n’ai plus besoin de direnv. mise gère tout :

mise.toml
[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 :

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"]
Fenêtre de terminal
mise run dev
mise run ci # Exécute lint, test, build en parallèle
mise tasks # Liste toutes les tasks

Les 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

Fenêtre de terminal
# Voir les outils outdated
mise outdated
# node 20.19.0 → 22.13.1
# terraform 1.14.3 → 1.15.0
# Mettre à jour
mise upgrade --bump

Lockfile 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 :

  1. Certains plugins spécifiques n’ont pas d’équivalent aqua/github
  2. 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 :