anyenv + n から asdf に乗り換えた感想
anyenv と n を使っていたのですが、
PCを新調したのを機に、 asdf に乗り換えてみました。
1. anyenv で抱えていた問題点
rbenv や pyenv などを一括で管理できる anyenv ですが、
当然、 rbenv などが抱えている問題を持っています。
それは、インストールできる Ruby バージョンの更新がちょい面倒なところです。
cd ~/.anyenv/envs/rbenv/plugins/ruby-build
git clone
をおこなわないと、 rbenv install --list
で表示される
インストールできる Ruby のバージョンが更新されません。pyenv も同様です。
2. n で抱えていた問題点
n はとっても便利で、
n lts
で Node.js の最新の LTS バージョンを入れてくるのがとても良いです。
一方、 .node-version
ファイルがディレクトリにあっても自動で Node.js のバージョンを切り替えてくれる機能はありません。
n auto
をおこなわないといけません。
また、インストールがちょっと面倒で、
昔は npm i -g n
だけで完了していたのですが、
Mac が /usr/local
ディレクトリの権限を厳しくした関係で、今は README にあるように
# make cache folder (if missing) and take ownership sudo mkdir -p /usr/local/n sudo chown -R $(whoami) /usr/local/n # make sure the required folders exist (safe to execute even if they already exist) sudo mkdir -p /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share # take ownership of Node.js install destination folders sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share
をおこなう必要があります。なかなか面倒です。
Linux だとこのインストールの問題はないのですけどね。
3. asdf を試しに使ってみた
上で書いた話を解決できるのかはわからないけれど、
周りで使っている人も多いので試しに使ってみました。
3-1. インストール
公式ドキュメントだとインストールの方法はけっこう複雑なのですが、
Mac だと brew install asdf
だけで済みます。
終わったら、 ~/.zshrc
内の anyenv の設定はコメントアウトし、asdf の設定を記述します。
# anyenv - if which anyenv > /dev/null; then eval "$(anyenv init -)"; fi + # if which anyenv > /dev/null; then eval "$(anyenv init -)"; fi + + # asdf + source /opt/homebrew/opt/asdf/libexec/asdf.sh
asdf plugin list all
でプラグイン一覧を確認したあと、
asdf plugin add ruby asdf plugin add nodejs asdf plugin add python
のようにプラグインを入れていきました。
( asdf plugin add ruby nodejs python
って1行で済むようになったらいいなあ…… )
3-2. 設定の更新
asdf デフォルトの .tool-versions
でなく
.ruby-version
などを見たり作成したりするようにしたいので、
~/.asdfrc
ファイルを作成し、以下の設定を書きました。
legacy_version_file = yes
(参考: https://github.com/asdf-vm/asdf-ruby#migrating-from-another-ruby-version-manager )
3-3. グローバルへのインストール
最新バージョンのインストールをそれぞれおこない、グローバルで使うよう設定していきます。
asdf install ruby latest asdf install python latest asdf install nodejs $(asdf nodejs resolve lts --latest-available)
本来は Node.js の LTS は asdf install nodejs lts
でインストールできるのですが、
現在こちらの issue にある通り正しく動かないので、
仕方ないので asdf install nodejs $(asdf nodejs resolve lts --latest-available)
でどうにかしました。
そしてデフォルトのバージョンをこの最新版に設定しました。
asdf global ruby latest asdf global python latest asdf global nodejs $(asdf nodejs resolve lts --latest-available)
3-4. プロジェクトで使うバージョンのインストール
.ruby-version のあるフォルダで asdf current
をおこなうことで、
必要なインストールコマンドがわかります。
asdf current nodejs 20.9.0 /Users/nekonenene/.tool-versions python 3.12.0 /Users/nekonenene/.tool-versions ruby 3.1.0 Not installed. Run "asdf install ruby 3.1.0"
このコマンドを実行すると、そのフォルダで自動的に Ruby のバージョンが切り替わるようになります。
4. 抱えていた課題は解決できたか
ざっと asdf を使ってみました。
1. と 2. の項で触れた問題点は解消できたのでしょうか?
- インストールできる Ruby バージョンの更新がちょい面倒な問題
- インストールできるバージョンの更新は、
asdf list all python
のタイミングで自動で完了します。cd
コマンドでの移動など不要になりました。便利ですね!
- インストールできるバージョンの更新は、
.node-version
ファイルがディレクトリにあっても自動で Node.js のバージョンが切り替わらない問題
このように、今までの課題は解決されました!!
5. asdf のデメリット
一方でデメリットもいくつかあります。
- コマンドが少し長くてわかりにくい。慣れかもしれませんが、今のところ
asdf
コマンドを打ってコマンドを確認することが多いです。asdf plugin
などと打ったときにもヘルプの一部が出てきたらうれしいなあ、と思います- リポジトリを見たらプルリクが出ていますね。マージされるといいなぁ
- ただ、現在 asdf のメンテナーは jthegedus さんほぼ1人の状態で回っているので、マージまでが難しいかもしれません
- 3-3. の項で書いたバグの問題で、Node.js の LTS バージョンを現在はカンタンにおこなえないのもマイナスです。
asdf install nodejs lts
が機能するよう直るといいですね……!
上のデメリット2つはコントリビュートで直せる可能性があるので、
(コミッターの人たちが忙しそうでマージまでが難しいかもしれませんが)
そこも念頭に入れつつ、今後は asdf を使ってみようかなと思いました。