とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

asdfに代わりmiseもよさげらしいので試してみる

つい最近、asdf関連の記事を書いたらmiseもいいですよとお告げがありました。miseって聞いたことなかったので軽くググるとasdfライクの何かなようです。面白そうなので試してみます。

mise

github.com

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というものがあります。

devops-blog.virtualtech.jp

aquaはasdfのplugin追加が面倒くさい問題(私が勝手に問題視してるだけ)を解決してくれるよいツールでした。miseはというasdf同様pluginの追加が必要みたいです。必要というか、asdfのプラグインを利用しているみたいでした。じゃあasdfでいいじゃん?となるところなんですが、mise-pluginsの説明にasdf-pluginsの問題点が書かれていました。

mise-plugins · GitHub

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で何をしているのかな?と思ったらコマンドの設定やコマンド実行時、ディレクトリ変更時のフックの設定をしてるみたいでした。ツールを使うまでの細々とした設定を一括でやってくれるのは便利ですね。

これでセットアップは完了みたいです。

続いて使い方を見ていきます。

mise.jdx.dev

まずは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も併用してみようと思います。