背景:「バージョン地獄」はもはや他人事ではない
開発者はよく、ソフトウェアのバージョンに関する「笑えない」状況に直面します。プロジェクトAはNode.js v14が必要で、プロジェクトBはv18を要求するといったケースです。一方で、古いPythonスクリプトは3.7でしか動かないのに、新機能のために3.11が必要になることもあります。
私がシステム管理者だった頃、etckeeperによる設定管理や環境のデバッグだけで午後を丸一日潰してしまったことがあります。デプロイ前にRubyのバージョンを切り替え忘れたために、アプリケーションが動作しませんでした。当時、私のマシンは「寄せ集めの鍋」状態でした。安定したターミナル環境を維持しようと試行錯誤していましたが、Nodeにはnvm、Pythonにはpyenv、Rubyにはrbenv。.zshrcファイルはこれらの管理ツールをロードするためだけに100行以上に膨れ上がり、シェルの起動が非常に遅くなっていました。
asdf-vmは、まさに救世主として現れました。5〜7つの個別のツールをインストールする代わりに、現代的ツールの一つであるこのフレームワークを導入するだけで済みます。これはプラグイン機構で動作します。必要な言語や、さらにはTerraform、Kubectlなどでさえ、プラグインを追加するだけで対応できます。一つの構文、一つのワークフローですべてが完結します。
Linuxへのasdf-vmのインストール
まずは、クリーンな環境から始めましょう。asdfはUbuntu、Debian、Fedora、そしてArch Linuxでもスムーズに動作します。
ステップ1:必要な依存関係のインストール
asdfをプルする前に、マシンにgitとcurlがインストールされている必要があります。UbuntuまたはDebianの場合は、以下のコマンドを実行してください。
sudo apt update
sudo apt install curl git -y
ステップ2:asdfのダウンロード
アップデートを容易にするため、GitHubのリポジトリから直接クローンするのが最善の方法です。現在はv0.14.0が安定版です。最新のタグは公式サイトで確認できます。
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0
ステップ3:シェルの設定 (Bash/Zsh)
これが重要なステップです。シェルの設定が足りないと、asdfコマンドは「command not found」になってしまいます。
Bashユーザー(Ubuntuのデフォルト)は、~/.bashrcファイルに以下を追記してください。
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.bashrc
echo '. "$HOME/.asdf/completions/asdf.bash"' >> ~/.bashrc
source ~/.bashrc
Zshユーザーの場合は、~/.zshrcファイルに以下を追加します。
echo '. "$HOME/.asdf/asdf.sh"' >> ~/.zshrc
source ~/.zshrc
実践的な設定:Node.js、Python、Goの管理
asdfの強みは、500以上のプラグインからなるエコシステムにあります。デフォルトの状態では、asdfは中身のない骨組みのようなものです。それぞれの言語をどのように扱うかを「教える」必要があります。
プラグインのインストール
各言語には専用のプラグインが必要です。現在の開発シーンで最も一般的な3つのプラグインから始めてみましょう。
# Node.js用のプラグインを追加
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
# Python用のプラグインを追加
asdf plugin add python
# Go用のプラグインを追加
asdf plugin add golang
特定のバージョンのインストール
プラグインを入れた後は、バージョンのインストールは数秒で終わります。Node.jsを例に見てみましょう。
# インストール可能なすべてのNode.jsバージョンをリスト表示
asdf list all nodejs
# 最新のLTSバージョンをインストール
asdf install nodejs lts
# プロジェクトごとの特定バージョンをインストール
asdf install nodejs 18.16.0
asdf install python 3.10.11
asdf install golang 1.20.4
実体験に基づいたアドバイス:asdfはPythonをソースコードからビルドします。マシンにlibssl-devなどのライブラリが不足していると、インストールコマンドはすぐにエラーを出します。心配しないでください。エラーログに従ってシステムパッケージを追加インストールし、再度実行すれば完了です。
GlobalおよびLocalバージョンの設定
これが最も価値のある機能です。asdfでは、マシン全体で使うデフォルトバージョンと、ディレクトリごとの個別バージョンを定義できます。
Global設定: このバージョンをあらゆる場所で使いたい場合に使用します。
asdf global nodejs 18.16.0
asdf global python 3.10.11
Local設定: 例えば、古いプロジェクトでNode v14の使用が必須だとします。そのディレクトリに移動して、次のように入力します。
cd ~/my-old-project
asdf local nodejs 14.21.3
この時、asdfは自動的に.tool-versionsファイルを作成します。ここからが魔法です。このディレクトリにcdで入るたびに、Node.jsは自動的にv14に切り替わります。ディレクトリを出れば、またv18に戻ります。手動で切り替える手間はもう必要ありません。
確認とワークフローの最適化
システムの現在の状態を確認するには、次のコマンドを使用します。
asdf current
画面には、現在どのバージョンが実行されているか、そこでそのソース(globalファイルかlocalファイルか)が正確に表示されます。
プラグインのメンテナンス
コミュニティは、セキュリティパッチに対応するためにプラグインを頻繁に更新しています。次の一行で、すべてを最新の状態に更新できます。
asdf plugin update --all
ある言語が不要になった場合は、削除してストレージを整理しましょう。
asdf plugin remove golang
チーム開発のためのヒント
.tool-versionsファイルをGitにコミットしてください。GNU StowでDotfilesを管理するように、同僚がコードをクローンした際、彼らはasdf installと入力するだけで、あなたと全く同じ環境を即座に構築できます。「なぜ自分のマシンでは動くのに、君のマシンでは動かないんだ?」という不毛な議論はもう終わりです。
asdfを使うことは、散らかったデスクを片付けるようなものです。設定に追われるのではなく、コードを書くことに集中できるようになります。もしnvmやpyenvの管理に疲れているなら、今すぐasdfを試してみてください。

