···11---
22date: 2025-12-19
33language: fr
44-title: Mise en place
44+title: Adieu `direnv`, Bonjour `mise`
55tags:
66 - linux
77 - tools
88-draft: true
88+ - shell
99+ - devops
910---
10111111-[//]: # (TODO image de couverture)
1212-1313-J'ai découvert Mise par deux canaux :
1414-1515-* le support par Clever Cloud (plutôt en tant que package manager donc), avec en particulier leur type d'image "Linux"
1616-1717-[//]: # (TODO remettre le lien)
1818-* le calendrier de l'avent de Siegfried Erhet, avec une approche de DevTool
1212+J'ai découvert `mise` dans le [calendrier de l'avent de Siegfried Ehret](https://sieg.fr/ied/avent-2025/04-mise/), avec une approche autour de l'outillage de dev.
19132014Étant utilisateur de `direnv` depuis plusieurs années, je suis habitué à travailler dans mon shell.
2121-Direnv souffre par contre de plusieurs défauts : il ne peut pas gérer d'alias et se configure uniquement avec du scripting shell.
1515+`direnv` souffre par contre de plusieurs défauts : il ne peut pas gérer d'alias et se configure uniquement avec du scripting.
1616+J'ai donc tout un tas de scripts shells qui traînent sur mes machines, plus ou moins adaptées aux package-managers `apt` et `pacman`, qui s'intègrent avec `direnv`. J'avais d'ailleurs écrit un [article sur mon usage de `direnv`](/2022/06/17/direnv-pour-votre-shell) en 2022.
22172323-Aujourd'hui, je teste l'outil "Mise", pour voir dans quelle mesure cet outil peut venir enrichir mon workflow de dev.
1818+Aujourd'hui, j'ai donc décidé de tester l'outil `mise`, pour voir dans quelle mesure cet outil peut venir enrichir mon workflow de dev, ou (pourquoi pas) remplacer `direnv`.
24192520<!--more-->
26212727-## Mise en place
2828-2929-Mise en place est un outil développé en Rust, ce qui promet de bonnes performances et de la stabilité.
2222+## mise-en-place
30233131-Il propose 3 types d'usage :
2424+[mise-en-place](https://mise.jdx.dev/) propose 3 types d'usage :
32253326* gestionnaire de packages (un peu comme `asdf`)
3427* gestionnaire de variables d'environnement (exactement comme `direnv` donc)
···36293730Il se veut aussi extensible avec la possibilité d'utiliser ou d'implémenter des plugins.
38313232+Il est développé en Rust, ce qui promet de bonnes performances et de la stabilité.
3333+3934## L'installation
40354141-L'installation est bien documentée sur le site web : https://mise.jdx.dev/installing-mise.html
3636+L'installation est bien documentée sur le site web : https://mise.jdx.dev/installing-mise.html
42374343-Sur mes postes Linux, j'ai suivi la procédure d'installation avec `apt` :
3838+Sur mes postes Linux, j'ai suivi la procédure d'installation avec `apt` :
44394540```shell
4646-curl -fSs https://mise.jdx.dev/gpg-key.pub | sudo tee /etc/apt/keyrings/mise-archive-keyring.pub 1> /dev/null
4747-echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
4848-sudo apt update -y
4949-sudo apt install -y mise
4141+$ curl -fSs https://mise.jdx.dev/gpg-key.pub | sudo tee /etc/apt/keyrings/mise-archive-keyring.pub 1> /dev/null
4242+$ echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.pub arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
4343+$ sudo apt update -y
4444+$ sudo apt install -y mise
5045```
51465252-Une fois l'installation terminée, la commande `mise` est disponible dans mon shell :
4747+Une fois l'installation terminée, la commande `mise` est disponible dans mon shell :
53485449```shell
5555-mise --version
5050+$ mise --version
5651 _ __
5752 ____ ___ (_)_______ ___ ____ ____ / /___ _________
5853 / __ `__ \/ / ___/ _ \______/ _ \/ __ \______/ __ \/ / __ `/ ___/ _ \
···62572025.12.10 linux-x64 (2025-12-16)
6358```
64596565-Une dernière étape dans la configuration est importante : la configuration du shell, afin que le shell appelle la commande `mise` lors du changement de répertoires.
6060+Une dernière étape dans la configuration est importante : la configuration du shell, afin que le shell appelle la commande `mise` lors du changement de répertoires.
66616767-Cette opération se fait en éditant le fichier de configuration de votre shell : `~/.bashrc` ou `~/.zshrc` par exemple.
6262+Cette opération se fait en éditant le fichier de configuration de votre shell : `~/.bashrc` ou `~/.zshrc` par exemple.
68636969-Pour Zsh que j'utilise, il faut alors simplement ajouter la ligne suivante dans le fichier `~/.zshrc` :
6464+Pour Zsh que j'utilise, il faut alors simplement ajouter la ligne suivante dans le fichier `~/.zshrc` :
70657166```shell
7272-eval "$(mise activate zsh)"
6767+$ eval "$(mise activate zsh)"
7368```
74697570Une fois ces opérations faites, il suffit donc de redémarrer votre shell pour que la configuration soit prise en compte.
76717772## Les devtools
78737979-Quand je switche entre mes projets, je switche aussi souvent de stack d'outillage, que ce soit la version de Java, de Node, ou d'outils divers (comme Hugo que j'utilise sur ce site).
7474+Quand je switche entre mes projets, je switche aussi souvent de stack d'outillage, que ce soit la version de Java, de Node, ou de divers outils (comme Hugo que j'utilise sur ce site).
7575+7676+Pour faciliter ces opérations, j'avais implémenté quelques scripts shell que j'utilisais depuis `direnv`. Ces scripts modifiaient mon $PATH pour pointer vers la bonne version de Java, de Node, etc. J'utilisais aussi parfois des outils comme `nvm`
7777+ou `tfenv`.
7878+7979+`mise` est une alternative plus beaucoup plus simple.
8080+8181+Pour les outils les plus courants, les langages de programmation principalement, `mise` dispose d'un plugin _core tools_ qui supporte leur configuration et activation automatique.
8282+Pour les autres outils ou packages, `mise` utilise un ou plusieurs backends (_asdf_ en fait partie) qui permettent l'installation sans avoir rien à configurer en plus. Les outils disponibles peuvent être listés avec la commande `mise registry` :
8383+8484+```shell
8585+$ mise registry | grep java
8686+java core:java
8787+8888+$ mise registry | grep graalvm
8989+graalvm asdf:mise-plugins/mise-graalvm
9090+```
9191+9292+La configuration se fait avec un fichier `mise.toml` ou `.mise.toml`.
9393+La configuration est hiérarchique, mise va lire le fichier de configuration dans le répertoire courant, et merger ou surcharger les valeurs de ce fichier avec les valeurs des répertoires parents.
9494+9595+Il est aussi possible de définir un fichier `mise.toml` à la racine du `$HOME` de l'utilisateur, ou dans le sous-répertoire `$HOME/.config/` pour partager des configurations sur tout le système.
9696+9797+### Une stack java
9898+9999+Déclarer une stack Java est très simple avec un fichier `mise.toml` :
100100+101101+```toml
102102+[tools]
103103+java = "temurin-25"
104104+maven = "3"
105105+```
106106+107107+Une fois le fichier crée, au chargement du répertoire, `mise` affichera une erreur, car il ne souhaite par exécuter les fichiers par défaut (par mesure de sécurité) :
108108+109109+```shell
110110+$ cd workspaces/gitlab-classrooms
111111+mise ERROR error parsing config file: ~/workspaces/gitlab-classrooms/mise.toml
112112+mise ERROR Config files in ~/workspaces/gitlab-classrooms/mise.toml are not trusted.
113113+Trust them with `mise trust`. See https://mise.jdx.dev/cli/trust.html for more information.
114114+mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information
115115+```
116116+117117+La commande `mise trust` permet donc d'activer le fichier de configuration donné :
118118+119119+```shell
120120+$ mise trust
121121+mise trusted /home/jwittouck/workspaces/gitlab-classrooms
122122+mise WARN missing: java@temurin-25.0.1+8.0.LTS maven@3.9.12
123123+```
124124+125125+Il est aussi possible de configurer `mise` pour truster des répertoires complets dans le fichier `.config/mise/config.toml` :
126126+127127+```toml
128128+[settings]
129129+trusted_config_paths = ["~/workspaces"]
130130+```
131131+132132+Une fois le fichier créé et trusté, `mise` affichera les outils manquants s'il y en a avec un warning :
133133+134134+```shell
135135+mise WARN missing: java@temurin-25.0.1+8.0.LTS maven@3.9.12
136136+```
137137+138138+Pour installer les outils manquants, il suffit alors d'exécuter la commande `mise install` :
139139+140140+```shell
141141+$ mise install
142142+mise maven@3.9.12 download apache-maven-3.9.12-bin.tar.gz 8.57 MiB/8.81 MiB (0s) ███████████████████░ 2s
143143+mise java@temurin-25.0.1+8.0.LTS download OpenJDK25U-jdk_x64_linux_hotspot_25.0.1_8.tar.gz 128.19 MiB/134.21 MiB (0s) ███████████████████░ 2s
144144+```
145145+146146+Une fois les outils installés, ils sont ajoutés au `$PATH` et peuvent être utilisés immédiatement :
147147+148148+```shell
149149+$ echo $PATH
150150+151151+/home/jwittouck/.local/share/mise/installs/java/temurin-25.0.1+8.0.LTS/bin:/home/jwittouck/.local/share/mise/installs/maven/3.9.12/apache-maven-3.9.12/bin:/home/jwittouck/.local/bin:/usr/local/bin:/usr/bin:/usr/local/sbin
152152+153153+$ java --version
154154+openjdk 25.0.1 2025-10-21 LTS
155155+OpenJDK Runtime Environment Temurin-25.0.1+8 (build 25.0.1+8-LTS)
156156+OpenJDK 64-Bit Server VM Temurin-25.0.1+8 (build 25.0.1+8-LTS, mixed mode, sharing)
157157+158158+$ mvn -v
159159+Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1)
160160+Maven home: /home/jwittouck/.local/share/mise/installs/maven/3.9.12/apache-maven-3.9.12
161161+Java version: 25.0.1, vendor: Eclipse Adoptium, runtime: /home/jwittouck/.local/share/mise/installs/java/temurin-25.0.1+8.0.LTS
162162+Default locale: en_US, platform encoding: UTF-8
163163+OS name: "linux", version: "6.17.12-1-manjaro", arch: "amd64", family: "unix"
164164+```
165165+166166+Si je veux utiliser une autre version de Java, rien de plus simple, je peux simplement modifier le fichier `mise.toml`, ou exécuter la commande `mise use` (qui va aussi modifier le fichier `mise.toml`) :
167167+168168+```shell
169169+$ mise use graalvm@25
170170+mise ~/workspaces/gitlab-classrooms/mise.toml tools: graalvm@25.0.1
171171+172172+$ mise use --remove java
173173+mise ~/workspaces/gitlab-classrooms/mise.toml removed: java
174174+175175+$ java --version
176176+openjdk 25.0.1 2025-10-21
177177+OpenJDK Runtime Environment GraalVM CE 25.0.1+8.1 (build 25.0.1+8-jvmci-b01)
178178+OpenJDK 64-Bit Server VM GraalVM CE 25.0.1+8.1 (build 25.0.1+8-jvmci-b01, mixed mode, sharing)
179179+180180+$ mvn -v
181181+Apache Maven 3.9.12 (848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1)
182182+Maven home: /home/jwittouck/.local/share/mise/installs/maven/3.9.12/apache-maven-3.9.12
183183+Java version: 25.0.1, vendor: GraalVM Community, runtime: /home/jwittouck/.local/share/mise/installs/graalvm/25.0.1
184184+Default locale: en_US, platform encoding: UTF-8
185185+OS name: "linux", version: "6.17.12-1-manjaro", arch: "amd64", family: "unix"
186186+```
187187+188188+C'est pratique, flexible et bluffant.
189189+190190+Les packages sont installés par défaut dans le répertoire `~/.local/share/mise/installs/`, et utilisent des liens symboliques pour relier les différentes version et alias de versions :
191191+192192+```shell
193193+$ tree -L 2 ~/.local/share/mise/installs/
194194+/home/jwittouck/.local/share/mise/installs/
195195+├── graalvm
196196+│ ├── 25 -> ./25.0.1
197197+│ ├── 25.0 -> ./25.0.1
198198+│ ├── 25.0.1
199199+│ └── latest -> ./25.0.1
200200+├── java
201201+│ ├── temurin-25 -> ./temurin-25.0.1+8.0.LTS
202202+│ ├── temurin-25.0 -> ./temurin-25.0.1+8.0.LTS
203203+│ ├── temurin-25.0.1+8.0.LTS
204204+│ └── temurin-latest -> ./temurin-25.0.1+8.0.LTS
205205+└── maven
206206+ ├── 3 -> ./3.9.12
207207+ ├── 3.9 -> ./3.9.12
208208+ ├── 3.9.12
209209+ └── latest -> ./3.9.12
210210+```
211211+212212+Vu que mon IDE (IntelliJ) télécharge aussi automatiquement des versions de Java, je risque d'avoir des doublons, mais je pense qu'il ne sera pas bien difficile d'utiliser ces versions à la place de celles proposées par IntelliJ.
213213+214214+Pour une stack Java plutôt classique, `mise` fait très bien le job.
215215+216216+### Une stack Hugo pour builder mon site
802178181-Pour les outils les plus courants, les langages de programmation principalement, mise dispose d'un plugin _core tools_ qui supporte leur configuration et activation automatique.
8282-Pour les autres outils ou packages, _mise_ utilise un ou plusieurs backends (_asdf_ en fait partie) qui permettent l'installation sans avoir rien à configurer en plus. Les outils disponibles peuvent être listés avec la commande `mise registry` :
218218+Mon site (ce site) est buildé avec [_Hugo_](https://gohugo.io).
219219+220220+Bien qu'installer Hugo est plutôt facile, autant essayer de basculer le maximum de choses avec `mise` pour ce test.
221221+222222+Hugo est disponible dans le registry de `mise` :
8322384224```shell
8585-$ mise registry
225225+$ mise registry | grep hugo
226226+hugo aqua:gohugoio/hugo ubi:gohugoio/hugo asdf:NeoHsu/asdf-hugo asdf:nklmilojevic/asdf-hugo
227227+hugo-extended aqua:gohugoio/hugo/hugo-extended
86228```
87229230230+Plutôt que d'intialiser directement le fichier `mise.toml` avec la configuration de l'outil,
231231+il est possible d'utiliser la commande `mise use`, qui va générer le fichier pour nous et installer l'outil directement, qui sera immédiatement utilisable :
882328989----
233233+```shell
234234+$ mise use hugo
235235+mise ~/workspaces/codeka.io/mise.toml tools: hugo@0.152.2
902369191-La prochaine publication est prévue autour du 🗓️
237237+$ hugo version
238238+hugo v0.152.2+extended+withdeploy linux/amd64 BuildDate=unknown
239239+```
922409393-Photo de couverture par sur 241241+Le fichier généré est alors le suivant :
242242+243243+```toml
244244+[tools]
245245+hugo = "latest"
246246+```
247247+248248+Utiliser une version "latest" est bien entendu déconseillé, mais cela permet de tester rapidement la nouvelle version de l'outil.
249249+250250+Et encore une fois, tout fonctionne parfaitement :
251251+252252+```shell
253253+hugo serve
254254+Watching for changes in /home/jwittouck/workspaces/codeka.io/{archetypes,assets,content,data,i18n,layouts,static,themes}
255255+Watching for config changes in /home/jwittouck/workspaces/codeka.io/hugo.toml, /home/jwittouck/workspaces/codeka.io/themes/poison/config.toml
256256+Start building sites …
257257+hugo v0.152.2-6abdacad3f3fe944ea42177844469139e81feda6 linux/amd64 BuildDate=2025-10-24T15:31:49Z VendorInfo=gohugoio
258258+259259+260260+ │ FR │ EN
261261+──────────────────┼─────┼─────
262262+ Pages │ 134 │ 26
263263+ Paginator pages │ 3 │ 0
264264+ Non-page files │ 234 │ 0
265265+ Static files │ 182 │ 182
266266+ Processed images │ 160 │ 0
267267+ Aliases │ 7 │ 1
268268+ Cleaned │ 0 │ 0
269269+270270+Built in 299 ms
271271+Environment: "development"
272272+Serving pages from disk
273273+Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
274274+Web Server is available at http://localhost:1313/ (bind address 127.0.0.1)
275275+Press Ctrl+C to stop
276276+```
277277+278278+## Utiliser des variables d'environnement
279279+280280+`mise` permet de déclarer des variables d'environnement dans le fichier `mise.toml` avec le bloc `[env]` :
281281+282282+```toml
283283+[env]
284284+SPRING_PROFILES_ACTIVE = 'local'
285285+```
286286+287287+Il est aussi possible de charger un fichier `.env` avec [une directive](https://mise.jdx.dev/environments/#env-directives) :
288288+289289+```toml
290290+[env]
291291+_.file = '.env'
292292+```
293293+294294+C'est ici très similaire à `direnv`, donc pas de surprise.
295295+296296+### Utiliser des secrets
297297+298298+Là où `mise` se distingue, c'est sur la gestion des secrets.
299299+300300+`mise` s'intègre avec `fnox` (par le même développeur). Il est alors possible de charger des secrets depuis un Vault ou un secret manager cloud (AWS Secrets Manager, Azure Key Vault, Google Cloud Secret Manager), depuis un Keypass.
301301+302302+`mise` s'intègre aussi avec `age` qui permet d'utiliser des clés SSH pour chiffrer les secrets, ce qui est bien pratique si vous baladez vos clés sur vos différentes machines, puisqu'il n'y a alors aucune configuration à faire la clé `~/.ssh/id_ed25519` ou `~/.ssh/id_rsa` sera utilisée (dans cet ordre de priorité).
303303+304304+305305+```shell
306306+$ mise set --age-encrypt --prompt GITLAB_CLIENT_ID
307307+Enter value for GITLAB_CLIENT_ID ************
308308+309309+$ mise set --age-encrypt --prompt GITLAB_CLIENT_SECRET
310310+Enter value for GITLAB_CLIENT_SECRET ************
311311+```
312312+313313+Les valeurs chiffrées sont stockées dans le fichier `mise.toml`, qui peut alors être poussé sur un repo git en toute sécurité :
314314+315315+```toml
316316+[env]
317317+GITLAB_CLIENT_ID = { age = { value = "KLUv/QBYDR0AukFwDj0ANfCYs5DmZabA2Mi9YcrEQIqnBlqmxxa45qzJ6BIme5SvwM1b8bd87RMmC0YR540QLz2IWr5cNzRj/PEI0ADOANIAqBfCLgps21MFvkmjrMekjza1mjgCw+p8L11IHD38hL0pa5LJTF+jo1AGgjcpTFoprubn359HcX5T458wH/F00eoLinZHXzTatFtdm3l6rwWfMp5Fb6Wb0fa9a3qt53IQaaN2bE4r8x/PWJqUtrROIYthKb91VtSKW/Lk6CrXY87IgenHjEcrm5N87Zo/pep79tdFOz0vxuWG89vnlpJTnIfd+XmzIY2pzaRAunuB0ar/sJi3lbR6PinpumTCpMJ4Cim3I9S2vN9+/tbwBCa1AbNNrhUxnDXLrdl8UoryOpoLM3a9fjoomVX5hnHybBTy3o4crTXKi0D6/qU0D3vGjsZHRe9DgyomNrrXJndAdY+m1phS2rGIyjZbqVcn3n2XRsoi7rb3E6Wx6oWCUyT+E1eRbZrmLMq8XpY+E6/PHVIDdkQdEe7hGJB2ReHvglVm1riPWty/iz6d7fTeDGKpsrY8sbv824jjf2j35IXd2au1Z6g2WUhRt+Hkiphy+32HK9mCYaWSDWt6Y8FgX3tV1HJ7f1P14P40p7iUxsEB9ZflPQbDSfbfZZWFIvO2BRFHUprYBzSEBxcJTc6zKoH1Fs5JE01sQOEy4YJkwqRC3QpH0k/7um0wn3yBvXkS00y88MyU+9JCsThhCE69nh/PKjt+rQt2ycvX/8RXRdkrDmu6CbNjHspqmbv8o74Hc6fsfVVKJ5Dz+O/6rOY58x/SlMlmddqAsxvy2Ke28eLceRzRAnronyS1FNNEb4xlnY+VUKNLYTUd+pPqydJwiCsrnV82yS2r1sznsqnm5mKhvjxH6G3RKC2GU3dfds0tqY8BOgbQuJHBUoGDD8SDDxMmSNQ4kWCIJqCARkaFF0J43FBAZMSHIwFKoMAhZAUBBxv4FlsKDTkW7AABsCFBhIoOP2L2h8kBBxxFQIDAwCCIEZ8DwAJBiNJB66KeAeNADy2GgSE10gpMw9uD+t2+iVrXN0Omy2vqB4+oaZeYO6UBXe2aSyhP/Hwkk8mkQjOVOno3j2vjtCOKpYv7MjhXLReVwzGzVs7Sg+k24m7Ouk1SQD2/cWi+cpl9Di3Z2W3jpbA6ZT0Tp/h5ax0nzFFitrK3mRpZTvHOecZW7VqL9EIWCCU9+2uFrmZzAgA", format = "zstd" } }
318318+GITLAB_CLIENT_SECRET = { age = "YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1yc2EgYWM5WlV3Cmpsa0EweTlISnFLQmJ4NHBRQTRDVGRBd21NM3JWbVo1b3NFZHQ3dXcvZHZaQmFYMkEyWjViWmpJWCtLT0R1aVkKckNsUW1qVHZ1NlBEelYzQm9nNkk1SEp3REJsNzZvdmJuTkdYd2tLV3VCRFBRUXlCYjhhVzNvSnBib0dDcUFXTwpydW1INWIyMWtjaCt2WnlGeEx5dXM5Q205NUJBdmlycjUzdE41ejFFOW9PZ1YzaXczM292bXlsSkpPWW5hVldQCkJOUUZ3ditlbGFJbzRWZU5TeTBaSitoUk1TeDh4RVJqUjRaVkV5MGJrOXhJeitsbjBKcEQ0TkZla1V4bnNybUoKWVBjeSttUkFMVkd2Q2t1dDJVUWxjMk9vcER3cWFZcjNBRHNTZVJqMGZNc01xQ1VZd3pHU2hQazJWczFRbjd6OAowSHRqS0tCeE1HL2MrVG5FaUhaVndvWm9xNzNrME41VjJDRzlzbEFGRzdvQ040elNSeVAxcVdGMVlSK2NsQlM3ClJFbGZtV2pVOUh3VmF2RXlhNE5pekpIcnVpSzF2WWs5YWMvSTRqYnBQMnBMUFpValNTajI2WVp2YXRSTWgxd1AKTGVZektqdWxjRENjMVJaZy9aVEhvQkgzNXdyT01PY1NKT2t0MHB2VW9RK1hCSmxkbk5aWElGVndKeTRZRi90VApXMDhnWFlCVGRZeTFZcHRKSUdRbHkrRXlidXdKY0lCUVNjYy8vR21LbTk5eG5UTFp3L1RUM3JFbldRNldkTkJFCmVsZ2VqWXc3c3Q0eERtb0YxSDhNZjlrOUdJdmp4QjhEVW16UlRGY0xrbGtBZXkwcVkvZ1MrWVRKYXdqTm9QYjkKcUJzNS9MdUR4UENvU05iRHo5cGVEaGpvTDVwdU0xMUsrUGRBQkNaUFZaVQotPiB0LWdyZWFzZSA5KklKaXIgWlcyCjJzUlRqRXo3ZnJ6ZVZndk92UVE5QllNejhNZGZqVjYxMWN5U0JjbzhUbTJhCi0tLSBmRXEwQnh0Ykc4NWtIdk1nd200LzI2aEZtVEJqZ2x6QWp3ZCs0TlJjYThBCrPsAPxQrwsNRNctYosJQ7GQM8+Zc4bdoMoTbSehN6Fyf/5AvfJ2ko3Gm5FJ9L2qnW0ZGW+QTLMsR4vLInmecojm/eu4LKC5EqBB/3oFCAJJNZAdOtYiJnwUCWml5WY" }
319319+```
320320+321321+Et les valeurs sont automatiquement déchiffrées pour être disponibles dans le shell en variable d'environnement :
322322+323323+```shell
324324+$ env | grep GITLAB
325325+GITLAB_CLIENT_ID=a578cf01-96cf-4d60-bef0-c89240583992
326326+GITLAB_CLIENT_SECRET=9520fa56-6663-4008-888a-cd50e6b575a9
327327+```
328328+329329+C'est clairement une killer-feature. Je n'ai pas pris le temps de tester en détail l'intégration avec `fnox`, mais je pense que je vais m'y atteler prochainement.
330330+331331+## Exécuter des tâches
332332+333333+Le dernier use-case proposé par `mise` est l'exécution de _task_, qui sont autant de petits scripts que l'on veut, un peu à la manière d'un `Makefile`, `justfile`, ou `Taskfile`.
334334+335335+L'avantage est que tout s'intègre parfaitement avec `mise`, il est facile d'utiliser des variables d'environnement et des tools dans des scripts qu'on va pouvoir exécuter directement avec `mise run`.
336336+337337+Et on peut aller assez loin dans la configuration, avec des dépendances entre les tâches ou conditionner l'exécution à la mise à jour d'un fichier par exemple.
338338+339339+Pour mon site, j'avais un `justfile` qui contenait quelques commandes, je l'ai rapidement migré, et en voici le résultat :
340340+341341+```toml
342342+[tools]
343343+hugo = "0.152"
344344+345345+[env]
346346+HUGO_OPTIONS = "--printI18nWarnings --printPathWarnings --cleanDestinationDir --logLevel debug"
347347+348348+[tasks]
349349+350350+[tasks.build]
351351+description = "Build le site avec Hugo"
352352+run = "hugo build $HUGO_OPTIONS"
353353+354354+[tasks.serve]
355355+description = "Lance le serveur de développement Hugo"
356356+run = "hugo server --openBrowser $HUGO_OPTIONS"
357357+358358+[tasks.draft]
359359+description = "Lance le serveur en incluant les brouillons et futures publications"
360360+run = "hugo server --openBrowser $HUGO_OPTIONS --buildDrafts --buildFuture"
361361+```
362362+363363+Maintenant, avec un simple fichier `mise.toml`, j'ai tout au même endroit, et je n'ai besoin que d'un seul outil.
364364+Les tâches peuvent bien entendu en appeler d'autres, ou utiliser des [fichiers de script](https://mise.jdx.dev/tasks/file-tasks.html) pour leur implémentation, cette partie est assez riche,
365365+366366+Je démarre mon site en test avec la commande `mise run draft` ou même directement avec `mise draft`, et je n'aurai plus à me soucier de l'installation de Hugo et Just sur mes machines (voire même dans ma CI 👀).
367367+368368+```shell
369369+$ mise run build
370370+[build] $ hugo build $HUGO_OPTIONS
371371+Start building sites …
372372+hugo v0.152.2-6abdacad3f3fe944ea42177844469139e81feda6+extended linux/amd64 BuildDate=2025-10-24T15:31:49Z VendorInfo=gohugoio
373373+374374+ │ FR │ EN
375375+──────────────────┼─────┼─────
376376+ Pages │ 134 │ 26
377377+ Paginator pages │ 3 │ 0
378378+ Non-page files │ 234 │ 0
379379+ Static files │ 182 │ 182
380380+ Processed images │ 160 │ 0
381381+ Aliases │ 7 │ 1
382382+ Cleaned │ 0 │ 0
383383+384384+Total in 304 ms
385385+Finished in 540.7ms
386386+```
387387+388388+C'est plutôt pratique de pouvoir avoir quelques scripts packagés avec cet outil. Ça permet surtout de ne pas avoir à installer d'autres outils comme `task` ou `just` sur mes machines.
389389+390390+## Conclusion
391391+392392+J'ai testé simplement pendant quelques heures, en migrant les outils de mon site et un de mes projets.
393393+Je suis vraiment bluffé par la puissance de `mise`, sa flexibilité et ses performances. C'est rapide à prendre en main, ça supporte tous les outils et langages que j'utilise, et ça vient en plus avec une solution pour la gestion des secrets et de scripting.
394394+395395+En une aprèm, je suis déjà conquis.
396396+397397+Adieu `direnv`, `asdf`, `task` et `just`, et tous mes scripts custom, vous m'avez bien servi.
398398+399399+## Liens et références
400400+401401+* Le blog post de Siegfried Erhet : https://sieg.fr/ied/avent-2025/04-mise/
402402+* Mon [article sur mon usage de `direnv`](/2022/06/17/direnv-pour-votre-shell)
403403+* La documentation officielle de `mise` : https://mise.jdx.dev
404404+ * L'installation de `mise` : https://mise.jdx.dev/installing-mise.html
405405+ * L'utilisation des DevTools : https://mise.jdx.dev/dev-tools/
406406+ * La liste des outils disponibles : https://mise.jdx.dev/registry.html#tools
407407+ * L'utilisation des variables d'environnement : https://mise.jdx.dev/environments/
408408+ * Utilisation de tâches : https://mise.jdx.dev/tasks/