anyenv から asdf に移行した

背景

これまで、 RubyPython のバージョンを切り替えるために anyenv を使っていた。
しかし anyenv ではいくつか困っていたことがあり、以前から気になっていた asdf というツールに移行することにした。

anyenv で困っていたこと

  • tfenv のような例外に対応できない
    • rbenv などと違って tfenv には init コマンドがない。そのため anyenv init 実行時にエラーが出てしまう
    • anyenv で tfenv をインストールすることはできるが、この点が考慮されていないので自分でなんとかする必要がある
    • tfenv に限らず、今後こういった例外が他にも出てくるかもしれない
  • init スクリプトが遅い
    • 各 env の init コマンドを実行していくので、それなりに時間がかかる
      • 自分の環境では 750ms ぐらい (rbenv, pyenv 利用)
    • これによってシェルの起動も遅くなってしまう
  • 最近あまりメンテされていないっぽい (困るというか不安)

asdf への移行

Mac の場合は Homebrew でインストールして、シェル起動時に init スクリプトを読み込むようにすればセットアップ完了。
init スクリプトの実行が速くて良い。自分の環境では 200ms ぐらい。 (ruby, python, terraform プラグイン利用)

asdf では RubyPython を管理する部分がプラグインとして提供されている。
プラグインが実装するコマンドが定められているので、anyenv + tfenv のようなエラーが起こることはない。

また、RubyPython だけでなく、 kubectl や sops などのツールも複数バージョン管理できる。
本当にたくさんのツールがサポートされているので、気になる人は一度見てみてほしい。

All Plugins - asdf vm - An extendable version manager

asdf では、リポジトリ.tool-versions というファイルを配置して各ツールのバージョンを管理する。
*env と同様に、複数バージョンの指定や system 指定もサポートされている。

$ cat .tool-versions
ruby 2.6.6
python 3.8.3 2.7.18 system

設定で legacy_version_file を有効にすれば、.ruby-version.python-version をそのまま利用することもできる。

$ cat ~/.asdfrc
legacy_version_file = yes

また、自分は rbenv-default-gems というプラグインを使って、Ruby インストール時に指定した gem を自動インストールするようにしていたのだが、ありがたいことに asdf-ruby でも同じ機能が用意されていた。

$ cat ~/.default-gems
bundler
solargraph

移行してみた感想

asdf に移行した結果、anyenv で困っていた点をすべて解消することができて最高という感じ。

legacy_version_file のおかげで、各リポジトリの設定ファイルを変更することなく移行できるし、anyenv の利用者と共存できるようになっていて良かった。

ただ、asdf のコマンド体系は若干わかりづらいところがあるので、ここは今後改善されてほしいところ。(その前に慣れるかもしれないが)