こんにちわ。 仕事以外のすべての時間を原神に捧げている @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_VERSION
に master
を指定するとよいです。
それでは 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 を気にいってくれたら幸いです。