asdf-vmとは?
プログラミング言語及びツールのバージョン管理ツールです。類似ツールに anyenv
があります。 anyenv
と比較すると、下記の点で優れています。
-
direnv
やsops
等のツールもプロジェクトごとにバージョン管理できる→READMEに記載するインストールセクションをすっ飛ばせる - バージョン管理したいツールはプラグインにより拡張できる
- プラグインはURL指定できるので、
-
asdf global
コマンドを使うと、ユーザーグローバルにツールのバージョン管理ができる ($HOME/.tool-versionsに永続化されているので、dotfilesと相性がいい)
使い方
インストール
基本的に https://asdf-vm.com/#/core-manage-asdf-vm を読んでインストールすればOK。 macOSでhomebrew を使っている場合は
brew install asdf
でインストールできます。
Gitのみでもインストールできて
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cd ~/.asdf
git checkout "$(git describe --abbrev=0 --tags)"
としましょう。
shellに読み込ませる
asdf環境をセットアップするため、homebrewを使っていてbashを使っているユーザーであれば下記を叩きましょう。
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile
echo -e "\n. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash" >> ~/.bash_profile
zshやfishをお使いの場合は上記のリンクにまとまっているのでそちらを参照してください。
プラグイン共通で使うパッケージ
openssl
やcurl
など、プラグイン共通で使うパッケージがあるので下記をインストールしましょう。
brew install \
coreutils automake autoconf openssl \
libyaml readline libxslt libtool unixodbc \
unzip curl
プラグインの追加/削除
利用可能なプラグインの一覧は
asdf plugin list all
で確認できます。例えばruby
の場合、anyenv
と違って内部的に rbenv
を使っているわけではありません。プラグインごとに必要な依存ツール等あるので、適宜プラグインのREADMEを参考にしてください。
例: nodejs pluginの場合
内部ではgpgを使って問題のあるバージョンではないことを検証しています。そのため、
brew install gpg
と叩いてgpgをインストールしておきましょう。
asdf plugin add nodejs
bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
というように、nodejsのプラグインをインストールした後、nodejsのリリースチームのキーリングを取り込む必要があります。
ツールのインストール
asdf install <plugin> <version>
と叩くと指定したツールのバージョンがインストールされます。
利用したいディレクトリで
asdf local <plugin> <version>
とすると、そのディレクトリ配下に .tool-versions
ファイルが生成され、プラグインとバージョンが保存されます。
.tool-versions
vs .node-version
etc
最近のバージョンの asdf
は .tool-versions
ファイルに利用するツールとバージョンを記述するようになりました。もし .node-version
や .ruby-version
など他のツールとの互換性を大事にする場合は
legacy_version_file = yes
と設定しましょう。
プラグインの作成方法
調査がてら、fzfのプラグインがなかったので作成してみました。
さて、プラグインの実態は特定のファイルを含んだ Git リポジトリです。プラグインを追加するとき
asdf plugin add <plugin-name> <git-url>
というようにplugin-name
の他 git-url
を指定できますが、ユーザーがcloneできればよいのでプライベートリポジトリも利用できます。
実装すべき内容は下記の2つです。
- bin/list-all: list-all はインストール時に指定可能なバージョンを指定するためのスクリプトです。バージョン番号をスペース区切りで標準出力すると、呼び出し元のプロセスが良しなに開業して表示します。
- bin/install: install は実際のインストールスクリプトです。 downloadスクリプトを別に分離することもできるようですが、多くのプラグインでは install 内でダウンロードも行っています。
GitHubを利用しているのであれば、GitHub API 経由でタグやリリースの一覧を取得し、それに添付されている成果物をダウンロード後、ソースしかなければビルドする、という流れをとっているものが多いです。
まとめ
asdf を使うと、プロジェクトごとに異なるバージョンのツールを切り替えながら使えます。コンテナ化によりプロジェクト専用の環境を用意することもできますが、コンテナにはまだまだなれないメンバーもいる状況では、asdf
は非常に便利ではないでしょうか。