メインコンテンツまでスキップ

miseに切り替えました

· 約5分
mebiusbox
engineer

開発ツールのバージョン管理やタスクランナーの機能などいい感じにまとまった mise を使うようにしました.

Windows で、開発ツールのバージョン管理は結局それぞれに特化したものを使っていました. たとえば、node なら volta, python なら Windows のインストーラを使うといった感じです. また、タスクランナーには cargo-make を使っていました.しかし、それぞれ使っているうちに不満も出てきました.

volta ならグローバルにインストールしたパッケージのバージョン管理がわかりづらく、最新のバージョンが存在するかどうかが volta 経由ではわかりませんでした. また、volta list の表示はもっと簡潔にしてほしい.表示すると縦に長くなってしまい確認しづらいと感じてました.

タスクランナーの cargo-make に関しては、タスク一覧の表示がわかりづらく、一覧表示のオプション指定も --list-all-steps と長いです. もちろん、エイリアスなどで対応できたりしますけど.また、余計な表示も多く、それだけ非表示するということができません. あと、これはメリットでもあるのですが、cargo-make は cargo 用に多くの機能が用意されています.実際、タスクランナーは rust プロジェクト以外で汎用的に使うことがとても多く、毎回 skip_core_tasks を設定するのが面倒とも感じていました. 他に、タスクはほぼ powershell で実行するのですが、powershell を使うタスクを作成する場合は、通常のコマンド実行よりも冗長でちょっと手間だと感じていました.

mise

そこで mise の登場です.mise は開発ツールのバージョン管理、環境変数の管理、タスクランナーの機能が1つにまとまったツールです. 使い方も難しくなく、表示もシンプルです.mise use でグローバルにインストールしたり、プロジェクトでのバージョンも管理できます.また、mise list の表示はとてもシンプルですし、バージョン管理も mise up でお手軽に実行できます.もともと Windows をメインに使っていたのですが、最近は linux 系も扱うことがあり、なるべく同じツールを採用するようにしました.node, python, go などは mise で管理しています.

タスクランナーも mise に移行しました.cargo-make の構文と比較的似ているので、移行はそんなに手間ではなかったです. とくに cargo-make はタスクに渡す引数の処理がイマイチで不満でした. それに対して mise のタスクに渡す引数はオプション引数を使えて書きやすいです. ただし、Windows の問題かもしれませんが、複数の引数を扱う場合は {{arg()}} での処理がうまくいきませんでした. いろいろ試した結果、usage を使った環境変数方式だとうまくいくのでその方法を使うようにしています.

[tasks.test]
usage = '''
flag "--user <user>" help="user" default="aaa"
flag "--hoge <hoge>" help="hoge" default="bbb"
'''
run = '''
Write-Host "$env:usage_user,$env:usage_hoge"
'''

ほかに、タスクはほぼ powershell で書いているといったのですが、mise では windows_default_inline_shell_args で既定のシェルを指定できます.

[settings]
windows_default_inline_shell_args = "pwsh -c"

これでタスクは pwsh シェルで実行されるようになります. たとえば cargo-make では

description = "Build book"
script_runner = "pwsh"
script_extension = "ps1"
script = '''
mdbook clean
mdbook build
'''

としていたところを mise では

description = "Build book"
run = ["mdbook clean", "mdook build"]

となります.

あと、mise run <taskname> でタスク実行するのですが、mise run とすればタスクを選択して実行できます. もちろん、タスク名を default としたタスクを作成すればそれが実行されます. タスクのリストは mise tasks または mise t で表示されます.これは cargo-make よりも簡潔でわかりやすいです. さらに mise tasks info <taskname> で usage も表示されてわかりやすいです. ほかにグルーピング機能もあってワイルドカードで実行するタスクを一括指定できます.

全体的に cargo-make よりかはシンプルで気に入っています.どちらかというと cargo-make の方が冗長的という感じがします.環境変数名とか長いですし.

さいごに

とりあえず mise に移行するのも手間ではなかったですし、管理も楽になりました.volta や cargo-make などが1つにまとめられて、設定も mise.toml に集約されるので非常にわかりやすいです.また、リスト表示が簡潔で把握しやすいです.タスクランナーも cargo-make より記述が楽になって快適です. ただ、不満というか不安な部分として、まだまだ安定していない感じやドキュメント不足などが挙げられます. それでも十分使えるという感触でした.以上です.