バージョン管理ツール asdf 使ってみた

# 概要

バージョン管理ツールにasdfを導入してみました。
代わりに rbenv, nvm を消しました。
どんな感じで導入したかのメモです。

:::note info
2024/12/15追記:
パフォーマンス・セキュリティーの観点から、
バージョン管理ツール asdf → mise に移行する記事を作成しました。
:::

https://qiita.com/murakami-mm/items/bd5174acc554a39f7291

# 環境

- Mac M1
- MacOS: 13.0
- シェルはzshを利用

# 本題

では、 rbenv, nvm を消して asdf を入れていきます。

## rbenv の削除

今までありがとう rbenv :pray: 

- uninstall の方法は公式より
    - https://github.com/rbenv/rbenv#uninstalling-rbenv

### やったこと

1. `~/.zshrc` から下記の行を削除
    ```diff:~/.zshrc
    - eval "$(rbenv init -)"
    ```
1. 下記を実行
    ```shell
    rm -rf "$(rbenv root)"
    ```
1. homebrew 経由で入れていたので下記を実行
    ```shell
    brew uninstall rbenv
    ```

## nvm の削除

今までありがとう nvm :pray: 

- uninstall の方法は公式より
    - https://github.com/nvm-sh/nvm#uninstalling--removal

### やったこと

1. 下記を実行
    ```shell
    rm -rf "$NVM_DIR"
    ```
1. `~/.zshrc` から下記の行を削除
    ```diff:~/.zshrc
    - export NVM_DIR="$HOME/.nvm"
    - [ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && . "/opt/homebrew/opt/nvm/nvm.sh"  # This loads nvm
    - [ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && . "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion
    ```

## asdf を導入

消したからには入れないといけない :fire: 

- インストール方法は公式より
    - [Getting Started | asdf](https://asdf-vm.com/guide/getting-started.html)

### やったこと

1. 依存関係をインストール
    ```shell
    brew install coreutils curl git
    ```
1. asdfをインストール
    ```shell
    brew install asdf
    ```
1. 下記を実行(zsh と homebrew 利用)
    ```shell
    echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
    ```

## asdf で ruby のバージョン管理

必要なバージョンのrubyをインストールしてみる

- コマンドは公式より
    - [All Commands | asdf](https://asdf-vm.com/manage/commands.html)


### やったこと

1. 下記を実行
    - プラグイン: [asdf-vm/asdf-ruby: Ruby plugin for asdf version manager](https://github.com/asdf-vm/asdf-ruby)
    ```shell
    asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git
    ```
1. ruby 最新安定バージョンの確認
    ```shell
    asdf latest ruby
    ```
1. 必要なバージョンをインストール(もうすぐEOFだけど、この時は2.7.5が必要だった)
    ```shell
    asdf install ruby 2.7.5
    ```
1. 開発中のプロジェクトのディレクトリに移動して下記を実行
    ```shell
    asdf local ruby 2.7.5
    ```
1. ↑を実行すると、 `.tool-versions` というファイルが作成される
    - 多分これをコミットする必要があるので、複数名で開発しているプロジェクトであれば、 asdf の導入自体を相談する必要がありそう
    ```.tool-versions
    ruby 2.7.5
    ```
1. つまり、 `.ruby-version` はもういらないので消す :hand_splayed: 

## asdf で Node.js のバージョン管理

必要なバージョンのNode.jsをインストールしてみる

- 公式のプラグインインストールの例がちょうどNode.jsだった
    - https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin

### やったこと

1. 依存関係のインストール
    ```shell
    brew install gpg gawk
    ```
1. 下記を実行
    - プラグイン: [asdf-vm/asdf-nodejs: Node.js plugin for asdf version manager](https://github.com/asdf-vm/asdf-nodejs)
    ```shell
    asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
    ```
1. 必要なバージョンをインストール(この時は14.17.3が必要だった)
    ```shell
    asdf install nodejs 14.17.3
    ```
1. 開発中のプロジェクトのリポジトリ内で下記を実行
    ```shell
    asdf local nodejs 14.17.3
    ```
1. ↑を実行すると、 `.tool-versions` というファイルが作成される
    ```.tool-versions
    nodejs 14.7.3
    ```
1. 開発中のプロジェクトのリポジトリ内で下記を実行
    ```shell
    npm install
    ```

# おわりに

いろんな言語のいろんなバージョン管理ツールを入れなくてよくなったので、
「このPCはrubyのバージョン管理ツールって何使ってたっけ・・・」みたいな悩みとおさらばできそうでよいと思いました :thumbsup: 

`.tool-versions` というファイルをコミットする必要が出てくるので、
複数名で開発している場合は、まずプロジェクトのメンバーにasdf導入の相談が必要ですね。
そんなに色々バージョン管理する必要がないのであれば、わざわざ乗り換えなくてもいいような気もします。

# 参考URL

- [asdfが便利だったので乗り換えた - とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア](https://devops-blog.virtualtech.jp/entry/20220928/1664333222)
- [asdf-vm/asdf: Extendable version manager with support for Ruby, Node.js, Elixir, Erlang & more](https://github.com/asdf-vm/asdf)