anyenv＋nodenvでnode.jsの複数バージョンを管理する(MacOS用)

# anyenv＋nodenvでnode.jsの複数バージョンを管理する(MacOS用)

## 概略

MacOS用のバージョン管理方法です。

node.jsのバージョン管理マネージャー「nodenv」を通して、.node-versionでnode.jsのバージョン情報を共有しつつ、自動で切り替わるように設定します。

xcode→Homebrew→anyenv→nodenvの順番でインストールの手順で実施します。

自動切り替え最高の体験。

#### リリース情報確認URL

- [Homebrewのリリースノート](https://github.com/Homebrew/brew/releases)
- [anyenvのリリースノート](https://github.com/anyenv/anyenv/releases)
- [nodenvのリリースノート](https://github.com/nodenv/nodenv/releases)
- [Node.jsのリリースノート](https://nodejs.org/ja/download/releases/)

### 動作確認済みバージョン

- Homebrew(v 2.4.14)
- anyenv(v1.1.1)
- nodenv(v1.4.0)
- macOS Catalina(v10.15.6)
- terminal(zsh)

### 更新履歴

- 2020/8/31 初稿

---

## xcodeのインストール

インストール済みかどうか、ターミナルから確認します。

```zsh:terminal
% xcode-select --version
↓
xcode-select version xxxx.
```

もし、インストールをしていない場合は、[Xcodeのダウンロードページ](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)からインストールしてください。（時間かかります。）

## すでにnode.jsがインストール済みの場合は削除する

はじめに、`node -v`を事項して、node.jsがインストール済みか確認します。昨日の自分は赤の他人です。

```zsh:terminal
% node -v
↓
v12.xx.x
```

バージョンが表示されてしまったら、node.jsを削除してください。

### node.jsがインストールされている場合は削除

[こちらの記事](https://qiita.com/gaipoi/items/406d6c4b1ccd1733318a)を参考にnode.jsを削除します。

```zsh:terminal
// クイックリファレンス
% which node                      // node.jsの実行時のフルパス取得
% sudo rm -rf /usr/local/bin/node // 実際の削除
% node -v                         // 削除されているか確認
% sudo rm -rf ~/.npm              // npm削除
% npm -v                          // 削除されているか確認
```


## Homebrewをインストールする

Homebrewがインストール済みか確認します。昨日の自分は赤の他人です。

```zsh:terminal
// インストール済みか確認のために、Homebrewのバージョンを表示する
% brew -v
↓
Homebrew 2.x.xx
Homebrew/homebrew-core (git revision ...)
```

Homebrewのバージョンが表示された方は、インストール済みです。anyenvのインストールの項へ移動してください。

バージョンが表示されなかった方は、[公式ドキュメント](https://brew.sh/index_ja)を参考にHomebrewをインストールします。
途中インストールユーザのパスワード入力を求められるので記載してEnterキーを押します。

```zsh:terminal
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
↓
% Password:鍵マーク
↓
==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh
```

インストール完了時に出てくるNext stepsに従って、Homebrewの動作を確認します。

```zsh:terminal
% brew help
↓
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
...
```

色々と出てきたら、Homebrewのインストール完了です。

## anyenvのインストール

[公式ドキュメント](https://github.com/anyenv/anyenv)に沿って、Homebrewでインストールします。

```zsh:terminal
% brew install anyenv
```

シェルにanyenvを設定しつつ、シェルの再起動をします。

```zsh:terminal
% anyenv init
% exec $SHELL -l
```

`anyenv -v`でバージョン情報が表示されたらインストール完了です。

```zsh:terminal
% anyenv -v
↓
anyenv 1.x.x
```

## anyenvのアップデートプラグインを導入

[`anyenv-update`](https://github.com/znz/anyenv-update)という、anyenv経由でインストールしたすべての`**env`をアップデートするプラグインをインストールします。公式ドキュメントに則ってインストールするだけです。

Tips: 最新バージョンのnode.jsなどを使用したい場合は、`anyenv update`する必要があります。

```zsh:terminal
% kdir -p ~/.anyenv/plugins
% git clone https://github.com/znz/anyenv-update.git ~/.anyenv/plugins/anyenv-update
```

準備OK。

## nodenvのインストール

nodenvのインストール前に、anyenvでインストールできる`**env`の種類を確認してみます。

```zsh:terminal
% anyenv install -l
↓
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  jlenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv
```

いろんな種類の言語が選べます。いいね。
今回は、node.jsのバージョン管理が目的なので、nodenvをインストールします。

```zsh:terminal
％ anyenv install nodenv
```

インストールが完了したら、シェルを再起動します。

```zsh:terminal
% exec $SHELL -l
```

動作確認のために、`nodenv -v`でバージョン情報を確認します。

```zsh:terminal
% nodenv -v
↓
nodenv 1.x.x+x.xxxxxx
```

nodenvのインストール完了しました。

## node.jsをインストールしてみる

[公式ドキュメント](https://github.com/nodenv/nodenv#command-reference)を掻い摘みつつ、node.jsの最新版をインストールしてみます。

### インストールできるnode.jsのバージョンを出力する。

```zsh:terminal
% nodenv install -list
↓
...
14.7.0
14.8.0
14.9.0
chakracore-dev
chakracore-nightly
chakracore-8.1.2
chakracore-8.1.4
...
```

いっぱい出てくるけど焦らない。執筆時点では`14.9.0`が最新版となります。

### 最新版をインストールして、グローバルに指定する

`install`コマンドで、最新版（執筆時点`14.9.0`）をインストールします。

```zsh:terminal
% nodenv install 14.9.0
```

`global`コマンドで、先ほどインストールした最新版をグローバルに指定し、反映を確認します。

```zsh:terminal
% nodenv global 14.9.0
↓
% nodenv versions
  system
* 14.9.0 (set by /Users/xxxxxx/.anyenv/envs/nodenv/version)
```

動作確認のために、`node -v`でバージョン情報を確認します。

```zsh:terminal
% node -v
↓
v14.9.0
```

OK。やっとnode.jsが入りました。

### プロジェクト毎に別バージョンのnode.jsを反映する

まずは、`install`コマンドで使いたいバージョンをインストールする。

```zsh:terminal
% nodenv install 14.8.0
```

プロジェクトルートへ移動します。

```zsh:terminal
% cd <プロジェクトルート>
```

`local`コマンドで、使いたいバージョンを指定します。

```zsh:terminal
% nodenv local 14.8.0
↓
% nodenv versions
  system
* 14.8.0 (set by /Users/xxxxxx/.anyenv/envs/nodenv/version)
　14.9.0
```

念のため確認します。

```zsh:terminal
% node -v
↓
v14.8.0
```

できました！

## .node-versionファイルでnode.jsバージョンを共有する

node.jsのバージョンを指定したいプロジェクトルートに、バージョンを書いた.node-versionファイルを置き、インストールされていないnode.jsのバージョンを記載します。

```text:.node-version
// .node-versionファイル
14.7.0
```

`node -v`でバージョンを確認をしようとして、インストールされてないよ！と怒られてみます。

```zsh:terminal
% node -v
↓
nodenv: version `14.7.0' is not installed (set by /Users/xxx/.node-version)
```

OK。怒られました。
次は、怒られたバージョンをインストールして、確認してみます。

```zsh:terminal
% nodenv install 14.7.0
% node -v
↓
v14.7.0
```

OK。指定バージョンのnode.jsが表示されました。

これで、node.js生活もシンプルに。やったね。