esm アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

asdf のススメ

こんにちわ。 仕事以外のすべての時間を原神に捧げている @kajisha です。

asdf とは

asdf の README から引用すると

asdf は単一のCLIツールで複数のランタイムバージョンを管理します。 
asdfは、プロジェクトごとに複数の言語のランタイムバージョンを管理できるCLIツールです。 
これは、gvm、nvm、rbenv、pyenv(およびその他)がすべて1つになっているようなものです。 
言語のプラグインをインストールするだけです!

とあるように anyenv に近いものですが、プラグインでサポートしている言語(言語に限りませんが)が圧倒的に多いのが特徴です。 Ruby, Python, Node.js, Golang, Rust などの主要な言語はもちろん starship, direnv などにも対応しており多彩なプラグインが利用可能です。

参考までに、わたしがインストールしているプラグインは以下のとおりです:

$ asdf current
awscli          2.1.31          /home/hiroshi/.tool-versions
bat             0.18.0          /home/hiroshi/.tool-versions
direnv          2.28.0          /home/hiroshi/.tool-versions
erlang          23.2.7          /home/hiroshi/.tool-versions
ghq             1.1.7           /home/hiroshi/.tool-versions
github-cli      1.7.0           /home/hiroshi/.tool-versions
golang          1.16.2          /home/hiroshi/.tool-versions
haskell         9.0.1           /home/hiroshi/.tool-versions
logtalk         3.00.0          /home/hiroshi/.tool-versions
mysql           8.0.23          /home/hiroshi/.tool-versions
neovim          nightly         /home/hiroshi/.tool-versions
nodejs          15.8.0          /home/hiroshi/.tool-versions
postgres        13.2            /home/hiroshi/.tool-versions
python          3.9.2           /home/hiroshi/.tool-versions
ruby            3.0.0           /home/hiroshi/.tool-versions
rust            1.50.0          /home/hiroshi/.tool-versions
sbcl            2.1.2           /home/hiroshi/.tool-versions
sqlite          3.35.2          /home/hiroshi/.tool-versions
starship        0.51.0          /home/hiroshi/.tool-versions
terraform       0.14.8          /home/hiroshi/.tool-versions

asdf のインストール

asdf のインストールは、各OSのパッケージマネージャからインストールすることも可能ですが、 ここでは、 Git を使ってインストールします。

$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.8.0

シェルに設定を追加します。わたしの普段使いのシェルは fish なので、fish を前提に記述します。

~/.config/fish/config.fish に以下の行を追加します。

source ~/.asdf/asdf.fish

fish の補完が効くようにします。

$ mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions

fish 以外のシェルのインストールについては、公式のドキュメントを参照してください。

asdf のプラグインを追加してみる

実際に Ruby を asdf で管理してみましょう。

$ asdf plugin add ruby

どのバージョンがあるのかリストしてみます。

$ asdf list all ruby
1.8.5-p52
1.8.5-p113
1.8.5-p114
1.8.5-p115
1.8.5-p231
1.8.6
1.8.6-p36
1.8.6-p110
1.8.6-p111
1.8.6-p114
...このあといっぱい続く

asdf の Ruby プラグインである asdf-ruby は内部で ruby-build を使っているので、rbenv を利用している方にはなじみのあるリストが表示されるはずです。 補足ですが asdf-ruby の ruby-build はリリース版を利用しているので master の ruby-build を利用する場合は、 環境変数 ASDF_RUBY_BUILD_VERSIONmaster を指定するとよいです。

それでは ASDF_RUBY_BUILD_VERSION=master を指定して 3.1.0-dev を入れてみましょう。

asdf でプラグインの特定のバージョンをインストールするのは asdf install [plugin] [version] という共通の構文になっています。 ちなみに [version] のところに latest と入れると最新版がインストールされるようになっています。常に最新版を追っかけたい人には便利な機能です。

$ env ASDF_RUBY_BUILD_VERSION=master asdf install ruby 3.1.0-dev
Downloading ruby-build...
Cloning into '/home/hiroshi/.asdf/plugins/ruby/ruby-build-source'...
remote: Enumerating objects: 120, done.
remote: Counting objects: 100% (120/120), done.
remote: Compressing objects: 100% (98/98), done.
remote: Total 11427 (delta 86), reused 39 (delta 16), pack-reused 11307
Receiving objects: 100% (11427/11427), 2.42 MiB | 4.25 MiB/s, done.
Resolving deltas: 100% (7553/7553), done.
Already on 'master'
Cloning https://github.com/ruby/ruby.git...
Installing ruby-master...
Installed ruby-master to /home/hiroshi/.asdf/installs/ruby/3.1.0-dev

ちゃんと入ったかどうか確認してみましょう。どのバージョンがインストールされているか確認するコマンドは asdf list [plugin] です。

$ asdf list ruby
  2.7.2
  3.0.0
  3.1.0-dev

インストールできたみたいですね。自分の環境全体で 3.1.0-dev を使うようにしてみます。 asdf のコマンドは asdf global [plugin] [version] です。

$ asdf global ruby 3.1.0-dev
$ ruby --version
ruby 3.1.0dev (2021-03-24T18:31:10Z master b25361f731) [x86_64-linux]

ただし、特定のディレクトリ(プロジェクト) では、別のバージョンを使いたいこともあると思います。その場合は、該当のディレクトリで指定のバージョンを使うようにします。 asdf のコマンドは asdf local [plugin] [version] です。

$ cd path/to/rails/project/
$ asdf local ruby 3.0.0
$ ruby --version
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]

これで、このディレクトリ以下では 3.0.0 が使われるようになります。

asdf のプラグインをつくるのはとても簡単

asdf がサポートしているプラグインが多い理由は、asdf プラグインのインタフェースが統一さているからです。 公式のドキュメントにあるように最低限必要なシェルスクリプトは以下の3つです:

Required Scripts
- bin/list-all - lists all installable versions
- bin/download - download source code or binary for the specified version
- bin/install - installs the specified version

わたしがつくった ghqプラグインを参照してみていただければわかると思いますが、 そこまで複雑なシェルスクリプトではありません。 (ちょっといいわけするとプラグインをつくった当時は bin/download はなかったような気がしてて作ってないです……)

プラグイン開発の詳細はドキュメントを参考にするか、既存のプラグインをベースに変更していくのでもよいと思います。 プラグインをつくったら公式に PR してとりこんでもらいましょう。 参考までにわたしが出したPRをはりつけておきます。(PR の Description になにも書いてなくてすみません……)

さいごに

asdf はサポートしているプラグインがいっぱいあってプラグインの開発も簡単です。 asdf を気にいってくれたら幸いです。