つい最近、asdf関連の記事を書いたらmiseもいいですよとお告げがありました。miseって聞いたことなかったので軽くググるとasdfライクの何かなようです。面白そうなので試してみます。
mise
Like asdf (or nvm or pyenv but for any language) it manages dev tools like node, python, cmake, terraform, and hundreds more. Like direnv it manages environment variables for different project directories. Like make it manages tasks used to build and test projects.
asdf + direnvのようなものでしょうか?ツールの管理、環境変数の管理、タスクの管理?を行えるようです。
Quickstartにインストール方法が記載されていました。ちなみに私はHomebrewからインストールしました。
asdfじゃダメなの?
同じようなツールにaquaというものがあります。
aquaはasdfのplugin追加が面倒くさい問題(私が勝手に問題視してるだけ)を解決してくれるよいツールでした。miseはというasdf同様pluginの追加が必要みたいです。必要というか、asdfのプラグインを利用しているみたいでした。じゃあasdfでいいじゃん?となるところなんですが、mise-pluginsの説明にasdf-pluginsの問題点が書かれていました。
asdf-pluginsでは、プラグインの公開前に審査などは行われず、悪意のあるコードが混入している可能性があるため、利用者は危険に晒されているようです。また、個人的な問題解決のために追加されたプラグインが、その後メンテされることもなく、放置されているとも書かれていました。
一方miseはこのような基準を設けているそうです。
mise/SECURITY.md at main · jdx/mise · GitHub
miseのプラグインには、3種類あります。miseのコードにハードコードされたプラグイン、mise-pluginsオーガニゼーションにあるプラグイン、それ以外の外部のプラグイン、です。ハードコードされたプラグインと、mise-pluginsでホストされたプラグインは、インストール時に警告は出ませんが、それ以外のプラグインはインストール時に警告がでます。また、mise-pluginsオーガニゼーションに移動されたプラグインのレビューは@jdxさんのみにコミット権限があるようなので、mise-pluginsにあるプラグインには悪意のあるコードが混入されにくいようになっているようです。
お試し
Quickstartの通りに進めていきます。まず初めにmise activate $SHELL
しないといけないみたいですね。私の環境はzshなのでmise activate zsh
します。
$ mise activate zsh >> ~/.zshrc
.zshrcを汚したくない人は別のファイルに出力して、それを.zshrcから読み込むようにしてもいいかもしれません。zshに限らず、bashなども同様です。ちなみに、activateで何をしているのかな?と思ったらコマンドの設定やコマンド実行時、ディレクトリ変更時のフックの設定をしてるみたいでした。ツールを使うまでの細々とした設定を一括でやってくれるのは便利ですね。
これでセットアップは完了みたいです。
続いて使い方を見ていきます。
まずはCoreプラグインのGolangを使ってみます。
$ mise install go mise go@1.23.1 ✓ installed
このままではgoが使えないので使えるようにします。
$ which go go not found $ mise use go mise ~/.mise.tol tools: go@1.23.1 $ go version go version go1.23.1 darwin/arm64
~/.mise.toml
が作成されました。
$ cat .mise.toml [env] [tools] go = "latest"
asdfと同じツールを管理するときは~/.tool-versions
でバージョン管理されるようです。試してみましょう。
$ asdf plugin add nodejs $ asdf install nodejs latest $ asdf global nodejs latest $ cat .tool-versions nodejs 22.8.0
mise listで確認します。
$ mise list Tool Version Config Source Requested aws-vault 7.2.0 awscli ref:2.17.47 awscli 2.17.52 github-cli 2.57.0 ~/.mise.toml latest go 1.22.7 go 1.23.1 helm 3.16.1 ~/.mise.toml latest hugo 0.134.2 kubectl 1.31.1 ~/.mise.toml latest node 22.8.0 ~/.tool-versions 22.8.0 stern 1.30.0 terraform 1.9.5 yamlfmt 0.13.0
asdfから追加したnodeのConfig sourceが~/.tool-versionsになっています。asdfとmiseの両方からツールの管理が行えそうです。
次はtestディレクトリを作成して、その下でgoをバージョン指定でインストールしていみます。
$ mkdir test $ cd test $ mise ls-remote go | tail -n 10 1.22.2 1.22.3 1.22.4 1.22.5 1.22.6 1.22.7 1.23rc1 1.23rc2 1.23.0 1.23.1 $ mise install go@1.22.7 mise go@1.22.7 ✓ installed
useをしないでgoのバージョンを確認してみると、先ほどインストールした1.23.1が表示されました。
$go version go version go1.23.1 darwin/arm64
useしてみます。
$ mise use go@1.22.7 mise ~/test/.mise.toml tools: go@1.22.7 $ go version go version go1.22.7 darwin/arm64
testディレクトリに.mise.tomlが作成され、バージョンが変更されました。
~
に戻ってバージョンを確認すると1.23.1が表示されます。
$ cd ~ $ go version go version go1.23.1 darwin/arm64
特定のディレクトリでバージョンを使い分けできています。
次にcommunity pluginをインストールしてみます。
特に意味はないですが、mise-plugins/yamlfmtをインストールしてみます。
$ mise use yamlfmt mise plugin:yamlfmt ✓ https://github.com/mise-plugins/asdf-yamlfmt.git#c5760c1 mise yamlfmt@0.13.0 ✓ installed mise ~/.mise.toml tools: yamlfmt@0.13.0
mise-plugins/asdf-yamlfmtがインストールされました。特に警告もありません。
次はよく使うであろうawscliをインストールします。awscliはmise-plugins/registry以下で定義されているexternal pluginです。SECURITY.mdによると、これは警告ができるはずですね。
(コードブロックにペーストすると見づらそうなので画像にしました)
警告がでましたね。Yesにしたらインストールされます。
ここまで試してわかったのですが、asdfのようにasdf plugin addやasdf localなどをする必要がないようです。asdfでは使用するプラグインを1つずつplugin addしていくのが面倒だったので、miseの方が手順が少なく、いいなと思いました。
環境変数を試す
direnvのようにディレクトリごとに環境変数も切り替えられるみたいです。切り替えるにはディレクトリ以下に.mise.toml
を設置します。
[env] NODE_ENV = 'production'
mise trust
コマンドを実行するとこの設定が有効化されます。
$ mise trust $ echo $NODE_ENV production
ファイルから読み込むこともできます。
$ echo "ENVIRONMENT='develop'" > .env
.mise.tomlでは_.fileで読み込むファイルを指定します。
[env] _.file = '.env'
direnvの.envrcでは、コマンドで文字列を加工し、その結果を変数に代入できました。miseではシェルスクリプトを使用します。
#!/bin/bash export KUBECONFIG="$PWD/.kube/config"
[env] _.source = "./script.sh"
これだけではsourceは使えないのでmise settings set experimental true
コマンドを実行します。
$ echo $KUBECONFIG echo $KUBECONFIG /path/to/test/.kube/config
ちなみに、.mise.tomlに直接KUBECONFIG=$PWD/.kube/config
と書いてみるとPWD環境変数が展開されませんでした。
[env] KUBECONFIG = "$PWD/.kube/config"
$ echo $KUBECONFIG $PWD/.kube/config
まとめ
asdf plugin addを必要としないのは楽でいいですね。セットアップに必要な手順を減らせると、それだけ簡単に始められます。また、一部のプラグインがセキュアになっているということで、それを使う人にとってはいいことかもしれません。
direnvの代わりとしても使えるのはいいかもしれません。ただし、.envrcに書いていたシェルの部分をスクリプトに落とし込む必要があるので、管理するファイルが増えるのがどうかなぁっという感じです。
便利なのは間違いなさそうですし、.tool-versionsでも管理できるみたいなので、miseも併用してみようと思います。