anyenv から asdf に移行した
背景
これまで、 Ruby や Python のバージョンを切り替えるために anyenv を使っていた。
しかし anyenv ではいくつか困っていたことがあり、以前から気になっていた asdf というツールに移行することにした。
anyenv で困っていたこと
- tfenv のような例外に対応できない
- rbenv などと違って tfenv には init コマンドがない。そのため
anyenv init
実行時にエラーが出てしまう - anyenv で tfenv をインストールすることはできるが、この点が考慮されていないので自分でなんとかする必要がある
- tfenv に限らず、今後こういった例外が他にも出てくるかもしれない
- rbenv などと違って tfenv には init コマンドがない。そのため
- init スクリプトが遅い
- 各 env の init コマンドを実行していくので、それなりに時間がかかる
- 自分の環境では 750ms ぐらい (rbenv, pyenv 利用)
- これによってシェルの起動も遅くなってしまう
- 各 env の init コマンドを実行していくので、それなりに時間がかかる
- 最近あまりメンテされていないっぽい (困るというか不安)
asdf への移行
Mac の場合は Homebrew でインストールして、シェル起動時に init スクリプトを読み込むようにすればセットアップ完了。
init スクリプトの実行が速くて良い。自分の環境では 200ms ぐらい。 (ruby, python, terraform プラグイン利用)
asdf では Ruby や Python を管理する部分がプラグインとして提供されている。
各プラグインが実装するコマンドが定められているので、anyenv + tfenv のようなエラーが起こることはない。
また、Ruby や Python だけでなく、 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 のコマンド体系は若干わかりづらいところがあるので、ここは今後改善されてほしいところ。(その前に慣れるかもしれないが)