CLIバージョンマネージャ
言語ランタイムや開発用CLIツールを「プロジェクトごとに指定のバージョンで使う」ためのツール群を束ねるハブノート。nvm/rbenv/pyenvのような言語ごとのバージョンマネージャを1本化しようという流れから始まり、現在は取得元の信頼性(サプライチェーン)とマシンのセットアップ全体をどこまで面倒見るかが分岐点になっている。
主要な3つ
- asdf — この領域を切り開いたプラグイン方式のツール。
.tool-versionsという設定ファイルの形式は事実上の標準になり、後発ツールも読める。2025年1月のv0.16.0でbashからGoに書き直された。ツールごとの取得方法は各プラグインのシェルスクリプトが持つ。 - aqua — Go製。ツール定義をYAMLのレジストリ(aqua-registry)で集中管理し、インストール時に外部コマンドを実行しない。チェックサム検証・Policy as Code・Cosign/SLSA検証といったセキュリティ機能が厚い。
- mise — Rust製。asdfの後発互換として始まり(旧名rtx)、現在は環境変数管理・タスクランナー・マシンのbootstrapまで守備範囲を広げている。shimではなくPATHを直接書き換える方式が速度面の売り。
設計上の対立軸
バージョン解決のタイミング
- shim方式(asdf) — コマンド呼び出しのたびにshimが解決する。確実だがオーバーヘッドが乗る。
- PATH書き換え方式(miseのactivate) — プロンプトやディレクトリ移動のときだけ解決し、以降は実体パスを直接叩く。
- lazy install(aqua) — PATHにはシンボリックリンクを置き、実行された時点で未インストールならその場で入れる。
ツール定義を誰が持つか - プラグイン(asdf、miseのasdf/vfoxバックエンド) — 取得方法をシェルコードで書く。柔軟だがメンテナへの信頼が必要。 - レジストリ(aqua、miseのaquaバックエンド) — 中央のYAMLで宣言する。第三者が「どのアセットがどのプラットフォーム向けか」を管理する。 - publisher自身が署名付きで宣言(Packslip) — 中央レジストリを経由せず、リリースの一部としてメタデータを配る。