今年の4月初頭から、これまで使っていた rbenv や nvm の代わりとして、複数の言語ランタイムのバージョンを統合的に管理するツールとして asdf を試しています。
言語だけでなく、いくつかのツール類 1 にも対応しています。
インストール
私は zplug を使っているので、
zplug 'asdf-vm/asdf'
で 導入 し、初期化コードを
# .zshrc
source $ZPLUG_REPOS/asdf-vm/asdf/asdf.sh
source $ZPLUG_REPOS/asdf-vm/asdf/completions/asdf.bash
のように ロードし ました。
2つめのファイルは補完定義ですが、 zsh でも bash 用でOKのようです。他に fish 用も 付属して います。
プラグインのインストール
さきほどインストールしたのは asdf のコア部分で、各言語のサポートはこのあとインストールするプラグインで実現しています。
ここでは Rubyプラグイン と Node.jsプラグイン を入れてみます。
$ asdf plugin-add ruby
$ asdf plugin-add nodejs
- ビルドに必要なライブラリ (readline など) は適宜インストールしておきます。
- nodejs プラグインは GnuPG で署名を検証するのでこれもインストールし、開発チームの鍵をインポート しておきましょう。
各言語の使用
インストール
$ asdf install ruby 2.6.3
$ asdf install nodejs 8.16.0
# etc.
バージョン指定
$ asdf global ruby 2.6.2
$ asdf local ruby 2.4.3
それぞれホームディレクトリもしくはカレントディレクトリの .tool-versions ファイルに記録されます。カレントディレクトリから親を辿って最初に見つかった .tool-versions ファイルに記載されたバージョンが使われます。
なお、 ~/.asdfrc ファイルに
legacy_version_file = yes
と 書いておく と、 .ruby-version や .node-version も認識してくれるようになります。
バージョン確認
$ asdf current
$ asdf current ruby
フックについて
~/.asdfrc に
pre_asdf_install_ruby = コマンド文字列
post_asdf_install_ruby = コマンド文字列
のように書くことで、指定のタイミングでフックコマンドを実行することが出来ます。
設定ファイルからの値の読み出しは grep や awk を駆使したシンプルな処理 なので、やりたいことが2行以上になるようであれば、外部スクリプトファイルにした上で、 設定ファイルでは それらを source
する ようにしたほうが無難でしょう。
たとえば、 Ruby のインストール前に configure に渡す引数を環境変数から渡すように設定 したり、 Ruby のインストール後に bundler が付属していなければインストールしたり、 gem コマンドを最新にしたり することができます。