asdf で Node.js をバージョン管理する

## 昔々あるところに

大昔にこの記事を書いたのですが、結局現在はanyenvは使っておらずasdfを使用しています。

https://qiita.com/ucan-lab/items/ce35bcaf2562054917a8

まぁ、乗り換えた理由は今のプロジェクトでasdfが使われてるから合わせておこうといったモチベーションでしたが、使った感じ良さげだったので共有します。

## asdf を使うメリット

anyenv のように nodenv を入れて、node を入れてとする必要がなく、
asdf 入れたら node を入れることができます。(もちろんバージョン管理ができます)

`.tool-versions` ですべてのツールのバージョンを共有できます。
`.nvmrc`, `.node-versions`, `.ruby-version` と管理していたのを1つのファイルで管理できます。

## asdf とは

The Multiple Runtime Version Manager
https://asdf-vm.com

色んなツールや言語のバージョン管理ツールです。

## インストール

MacであればHomebrewから簡単にインストールできます。
[こちら](https://asdf-vm.com/guide/getting-started.html)から環境に合わせて各自インストールしてください。

```
$ brew install asdf

$ asdf --version
v0.12.0
```

インストールできたらご利用のシェルに応じて設定します。

```
$ echo $SHELL
/bin/zsh
```

私はzshを使用しているので、zshの設定を行います。
異なるシェルを使用していれば[こちら](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf)から合わせて設定してください。

```
$ echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc
```

インストールと設定は完了です。

## 使い方

- asdfのコマンド一覧
  - https://asdf-vm.com/manage/commands.html
  - `asdf` コマンドで見れます
- asdfのプラグイン一覧
  - https://github.com/asdf-vm/asdf-plugins
  - `asdf plugin list all` コマンドで見れます。
- `.tool-versions`, `.asdfrc` などの構成ファイルについて
  - https://asdf-vm.com/manage/configuration.html

### 既存の環境を再構築する

asdfの環境で開発しているプロジェクトに入り、git cloneしてから環境構築する場合の手順です。

```
$ asdf install
```

だけでNode.jsに限らず `.tool-versions` で管理されているツールの指定したバージョンがインストールされます。
既存環境の再構築は一瞬です。

### Node.jsの環境を新たに構築する

```
$ asdf plugin list all
nodejs                        https://github.com/asdf-vm/asdf-nodejs.git
```

プラグインのリストの中からnodejsを探します。
執筆時点で678件ものプラグインが登録されていました。

```
$ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
```

これでnodejsプラグインのインストールは完了です。

```
$ asdf list
nodejs
```

Nodejsをインストールする

#### 最新版のインストール

```
$ asdf install nodejs latest
```

#### バージョンを指定してインストール

```
# インストール可能なバージョンの一覧
$ asdf list all nodejs

# バージョンを指定してインストール
$ asdf install nodejs 18.17.0
```

#### Node.jsの設定

ローカルにインストールされたNode.jsのどのバージョンを使用するか設定します。

```
$ asdf list
nodejs
  18.17.0
  20.4.0
```

```
# 最新版を使う
$ asdf set -u nodejs latest

# バージョンを指定して選択
# asdf local nodejs 18.17.0
```

`asdf local` するとカレントディレクトリに `.tool-versions` ファイルが作成されています。

```
$ cat .tool-versions
nodejs 18.17.0
```

直接このファイルを書き換えてバージョン設定してもいいし、コマンドで設定してもどちらでも良いです。

```
$ node --version
v18.17.0
```

Node.jsがインストールされたことを確認できました。
新たに環境を用意する場合もとても簡単です。

#### 補足: node コマンドを実行できない場合

私はなったことないですが、うまくnodeコマンドを読み込めていなかった場合は下記コマンドでパッケージのバージョンに合わせてshimを再生成してくれるそうです。

```
$ asdf reshim nodejs
```

#### 補足: グローバル設定

```
$ asdf set -u nodejs latest
```

`asdf global` を設定すると `$HOME/.tool-versions` が作成され、 `.tool-versions` がない場所ではグローバルの設定が参照されます。

#### 補足: 既存のバージョン管理ツールのファイル

`.asdfrc` というファイルを配置すると `.node-version` と他のツールで使用していたファイルを参照できます。

```.asdfrc
legacy_version_file = yes
```

基本的にこの設定は使用しない方が良いです。
プロジェクト内で使用するツールが混在している...などそういった場合に苦肉の策で使うかな...？

#### 補足: Yarn インストール

Nodeのパッケージ管理にnpmではなく、yarnを使いたい場合ですがasdfはyarnのプラグインも提供されています。

```
$ asdf plugin add yarn https://github.com/twuni/asdf-yarn.git
$ asdf install yarn latest
$ asdf global yarn latest
$ yarn --version
1.22.19
```

`yarn` をインストールできました。

#### 補足: yarn インストールでエラー

```
$ asdf install yarn latest
Missing one or more of the following dependencies: tar, gpg
```

上記のエラーが出た場合は下記のコマンドを実行する。

```
$ brew install gpg
```

<!--

### 補足: Node.jsのインストール場所

```
$ which node
~/.asdf/shims/node

$ cat ~/.asdf/shims/node
#!/usr/bin/env bash
# asdf-plugin: nodejs 18.17.0
# asdf-plugin: nodejs 20.4.0
exec /usr/local/opt/asdf/libexec/bin/asdf exec "node" "$@" # asdf_allow: ' asdf '

$ npm -v
9.6.7

$ which npm
~/.asdf/shims/npm
```

-->

## asdfのメンテナンス

特にやらなくても良いですが、新しいバージョンを使ってみたいなっていう時はasdf本体やプラグインのアップデートが必要です。

```
# asdf 本体のアップデート
$ brew upgrade asdf

# asdf すべてのプラグインのアップデート
$ asdf plugin update --all
```

## 関連記事

https://qiita.com/ucan-lab/items/38e5663e43bafaca1a0b