ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

anyenv + n から asdf に乗り換えた感想

anyenvn を使っていたのですが、
PCを新調したのを機に、 asdf に乗り換えてみました。

1. anyenv で抱えていた問題点

rbenvpyenv などを一括で管理できる 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 のバージョンが切り替わらない問題
    • asdf では .node-version.ruby-versionディレクトリにあれば、自動でバージョンが切り替わります
    • ただし、 n auto と違って package.json 内に書いてある Node.js バージョンは読み取りません

このように、今までの課題は解決されました!!

5. asdf のデメリット

一方でデメリットもいくつかあります。

  • コマンドが少し長くてわかりにくい。慣れかもしれませんが、今のところ asdf コマンドを打ってコマンドを確認することが多いです。 asdf plugin などと打ったときにもヘルプの一部が出てきたらうれしいなあ、と思います
    • リポジトリを見たらプルリクが出ていますね。マージされるといいなぁ
    • ただ、現在 asdf のメンテナーは jthegedus さんほぼ1人の状態で回っているので、マージまでが難しいかもしれません
  • 3-3. の項で書いたバグの問題で、Node.js の LTS バージョンを現在はカンタンにおこなえないのもマイナスです。 asdf install nodejs lts が機能するよう直るといいですね……!

上のデメリット2つはコントリビュートで直せる可能性があるので、
(コミッターの人たちが忙しそうでマージまでが難しいかもしれませんが)
そこも念頭に入れつつ、今後は asdf を使ってみようかなと思いました。