
asdfは2014年にAkash Manohar氏が公開した、複数の言語ランタイムやツールを単一の仕組みで切り替えるバージョン管理ツールである。当初はRubyとNode.jsの切替を扱うシェルスクリプト集として始まり、後にプラグイン構造を採用してPython、Erlang、Go、Terraformなど300種類以上を対象に取り込んだ。.tool-versionsファイルにプロジェクト毎の希望バージョンを記述するだけで、ディレクトリ移動と同時に正しい処理系へ自動切替される点が特徴で、polyglotな開発組織で広く採用された。
この記事の目次
- rbenvやnvmを束ねる発想の起点
- shimsとplugin方式の仕組み
- `.tool-versions`によるプロジェクト固定
- 性能面の課題と最近の動き
- まとめ
rbenvやnvmを束ねる発想の起点

2010年前後のWeb開発者の手元には、Ruby用rbenv、Node.js用nvm、Python用pyenv、Erlang用kerlといった言語ごとの個別ツールが乱立していた。設定や挙動が微妙に異なり、新メンバーのオンボーディング時に説明が必要になることも多かった。Akash Manohar氏は2014年にこの状況を「インストーラ群の上に共通APIを置けば解決できる」と発想し、asdfをzshプラグインとして公開した。
初期のasdfはRubyとNode.jsだけを対象としたが、Bash/Zshで動く小さなスクリプトとプラグインフォルダ構造の組み合わせが評判となり、コミュニティ主導で対応言語が爆発的に増えた。2018年頃にはErlang.orgの公式ドキュメントでも推奨インストール方法として紹介されるようになり、Elixir/Erlang界隈での標準的選択肢として根付いた。
shimsとplugin方式の仕組み

asdfの核心はshimsと呼ばれる中継スクリプトにある。asdf install python 3.12.1などでバージョンを入れると、PATHの優先位置に置かれた~/.asdf/shims/pythonがインタプリタ呼び出しを受け、.tool-versionsを辿って実体のバイナリへ転送する。これにより同じpythonコマンドがディレクトリ毎に異なるバージョンを指すことになり、複数プロジェクト並行開発の負荷を大きく下げる。
プラグインはGitリポジトリ単位で配布され、asdf plugin add nodejsのように追加する。プラグインの中身はbin/installやbin/list-allなどの規約スクリプトで、新言語への対応は数十行のシェルで完結する。公式コミュニティのプラグインインデックスには2024年時点で350以上が登録され、Terraform・kubectl・OpenJDK・GHC・Pythonなど幅広いツールが扱える。
`.tool-versions`によるプロジェクト固定

プロジェクトルートに.tool-versionsを置き、nodejs 20.11.1やpython 3.12.1のように1行1ツールで書くと、cdした瞬間にasdfが該当バージョンに切替える。チーム全員が同じファイルをコミットすることで、READMEに「Node.jsは20系」と書く運用より遥かに事故が起きにくい。CIでもasdf install一発で同じバージョンを再現できる点が大きい。
ライバルとしては言語特化のpyenv/nvm、後発の統合系であるmise(後述)やvolta、devboxなどがあるが、asdfは「シェル中心・プラグイン任意・幅広い対応」というスタンスでバランスを取り続けている。Pythonビルドにopensslヘッダが必要、Erlangにwxwidgetsが必要、といった依存はプラグインの責任で記載されており、エラー時の問題切り分けがしやすい点も実務で効いてくる。
性能面の課題と最近の動き

shims方式の弱点として、コマンド呼び出しごとにshimのスクリプトがBashプロセスを起動するため、特にPython製ツールチェーンでオーバーヘッドが顕在化する。プロジェクトのrootでmake testを回したときに数百msのオーバーヘッドが乗るケースもあり、Rust製の代替であるmiseが台頭する一因となった。asdf自体も2023年頃からGo言語による再実装が議論され、2024年にはasdf v0.15系で性能改善を進めている。
個人開発者がmiseに乗り換える流れがある一方、企業ではプラグイン資産の蓄積と長期運用の安定性からasdfに留まる選択も多い。.tool-versionsという規約はmiseとも互換で、両者を行き来する移行コストは低い。複数プロジェクト・複数言語を抱える組織にとって、asdfは依然として有力な標準化手段である。
まとめ
asdfは2014年にRubyとNode.jsの切替ツールとして始まり、プラグイン構造によって多言語のversion managerへと進化した。.tool-versionsを中心としたプロジェクト固定の文化はmiseなど後継ツールにも引き継がれており、polyglotな開発を支える基盤として現在も中核的役割を担い続けている。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント