asdf

複数の言語ランタイム・CLIツールのバージョンをプロジェクトごとに切り替える、プラグイン方式のバージョンマネージャ。nvm・rbenv・pyenv・gvmのような言語ごとのツールを1つのCLIに統合することを狙ったもので、公式のキャッチコピーは “The Multiple Runtime Version Manager"。@HashNukeが作り、現在はコミュニティでメンテされている。MITライセンス、asdf-vm/asdfは25.6k star(2026-09時点)。

基本の考え方

  • プラグイン方式 — asdf本体はツールの取得方法を知らない。asdf plugin add nodejsのようにプラグインを入れると、そのプラグインがlist-all・download・installといったスクリプトを提供してインストールを担当する。プラグインの作成はasdf-plugin-templateから始められる。
  • .tool-versions — プロジェクトルートに置く1枚のファイルに、使うツールとバージョンをまとめて書く。
  nodejs 20.11.0
  ruby 3.3.0
  • 既存の設定ファイルも読む — .nvmrc・.node-version・.ruby-versionといった言語ごとの慣習的なバージョンファイルも認識するので、移行しやすい。
  • shim方式 — ~/.asdf/shimsに各コマンドのshimを置き、実行のたびにshimがカレントディレクトリから.tool-versionsを辿ってバージョンを解決する。bash/zsh/fish/elvishに対応し、GitHub Actionも提供されている。

Goによる書き直し(0.16.0)

長らくbashスクリプトの集合体だったが、2025年1月30日リリースのv0.16.0でGoに書き直された。88本のPRにまたがる作業で、より速く・シンプルで・メンテしやすいコードベースにすることが目的。

  • Bashスクリプト群から単一バイナリになった。
  • 0.15.0比で操作が2〜7倍速くなった。
  • 言語の変更に起因するもの、コードの単純化のためのもの、UX改善のためのものと、複数の理由で破壊的変更が入っている。ディレクトリ構成も大きく変わった。0.16.0の旧bashコードには移行を促す警告が仕込まれた。
  • プラグインと既存のバージョンデータについては後方互換が保たれており、そのままアップグレードできる。

shim方式のコスト

asdfの設計上の特徴であり弱点でもあるのがshim。コマンドを叩くたびにshimを経由してバージョン解決が走るため、呼び出しのオーバーヘッドが積み重なる。この点を主要な差分として打ち出しているのが後発のmiseで、shimではなくプロンプト・ディレクトリ移動のタイミングでPATH自体を書き換え、以降は実体パスを直接叩く方式を取っている(miseもエディタ向けにshimは用意している)。

もう一つ指摘されるのがプラグインの信頼性で、asdfのプラグインは操作のたびにシェルコードを実行するためメンテナを信頼する必要がある。aquaやmiseはレシピ/レジストリからバイナリを直接ダウンロードする方式でこの信頼を減らしている。

後発ツールとの互換関係

  • miseはasdfの.tool-versionsを読め、asdfプラグインもサポートする(Rustでの再実装であり、asdf CLI自体は使わない)。nodejs/golangのような旧来のツール名も認識する。
  • aquaはプラグインではなくYAMLのレジストリでツール定義を集中管理する方式で、asdfとは設計が異なる。

CLIバージョンマネージャの中での位置づけ

この領域の原点にあたるツール。.tool-versionsとプラグインという2つの発明が後発ツールの前提になっており、miseは.tool-versionsとasdfプラグインの両方に互換性を持たせている。一方で「shimを毎回通す」「プラグインがシェルコードを実行する」という設計が、mise(PATH書き換え)やaqua(レジストリ方式・外部コマンドを実行しない)が差別化する出発点になっている。

出典

#cli #golang #devops

作成日時: 2026-09-07 23:35 / 更新日時: 2026-09-07 23:35