anyenvとnodenvでNode.jsのバージョンを管理

# はじめに

自身のメモとして、本記事ではmacOSでanyenvとnodenvを活用し、Node.jsを一つのPCで複数バージョン使える環境の構築手順を記載します．

# Node.jsのバージョン管理をしたい理由

Node.jsを利用した開発において、複数のプロジェクトを同一PCで開発する場合、異なるバージョンのNode.jsを利用する必要性が出てきます．anyenvを利用することで、ディレクトリごとに異なったNode.jsのバージョンの利用が出来るようになります．

# 出てくる登場人物

[Homebrew](https://brew.sh/index_ja)

- Homebrew（ほーむぶるー）とは、macOS上で動作するパッケージ管理システムです．[パッケージ管理システム](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0#:~:text=%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%EF%BC%88%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%8B%E3%82%93,%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)とはパッケージをインストールしたりアンインストールしたい出来るシステムのことを指します．Homebrewを利用することで、Macのターミナルから簡単にパッケージの追加・削除を行うことが出来ます．

[anyenv](https://github.com/anyenv/anyenv)

- 開発環境によって同一のプログラミング言語であっても、使用するバージョンがプロジェクトごとに異なる場合があります、プロジェクトごとに異なるバージョンを使いたいというニーズを解決するために、プログラミング言語のバージョンを切り替えられるツールを利用します．Rubyのバージョン管理をするrbenv、Pythonのバージョン管理をするpyenv、Goのバージョン管理をするgoenvなど、プログラミング言語ごとに、**envといった名称でバージョンを切り替えられるツールが存在します．anyenv（えにーえんぶ）は、これらを包括的に管理できます．本記事では、Node.jsのバージョン管理の手順を記載します現時点で利用しなくても今後利用する可能性があるため、入れておくと良いツールです．

[nodenv](https://github.com/nodenv/nodenv)

- nodenv（のーどえんぶ）はNode.jsのバージョン管理ツールです．1つのPCに複数のNode.jsのバージョンを切り替えて使うことが出来ます．本記事ではanyenv上に、nodenvの環境を構築します．

# Homebrewのセットアップ

Homebrewの[公式サイト](https://brew.sh/index_ja)にアクセスします．公式サイトに記載のスクリプトをコピーします．

![_2021-06-15_3.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920063/f48eac24-1540-385b-b69b-87c7289823a6.png)

macOSのターミナルを開き、コピーしたスクリプトをペーストして、Homebrewをインストールします．

```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストールが正しくされたか確認します．

```bash
$ brew -v
Homebrew 3.1.12
Homebrew/homebrew-core (git revision 81f5f69157; last commit 2021-06-15)
Homebrew/homebrew-cask (git revision db78a2b6e2; last commit 2021-06-15)
```

# anyenvのセットアップ

Homebrewを利用しanyenvをインストールします．

```bash
$ brew install anyenv
```

インストールされたか確認します．

```bash
$ anyenv -v
anyenv 1.1.3
```

シェルの設定ファイルに`eval "$(anyenv init -)"`を追加します．

```bash
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
```

シェルを再読み込みし変更した設定を読み込みます．

```bash
$ exec $SHELL -l
```

下記のようなエラーメッセージが出る場合があります．

```bash
ANYENV_DEFINITION_ROOT(~/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
> anyenv install --init
```

下記を実行し、manifest directory を作成します．`~/.config/anyenv/anyenv-install`にマニフェストディレクトリが作成されます．anyenv利用するのに必要な設定ファイルだと思ってください．

```bash
$ anyenv install --init
```

あらためてシェルを再読み込みし変更した設定を読み込みます．

```bash
$ exec $SHELL -l
```

これでanyenvの設定は完了です．最後にanyenvで利用できるenv系のツールを下記で確認します．Node.js以外に、Ruby, Go、Swiftなど様々なツールのバージョン管理ができることがわかります．今回は、下記に記載のあるNode.jsのバージョン管理が出来るnodenvをインストールします．

```bash
$ anyenv install -l

  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  jlenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv
```

# nodenvのセットアップ

Node.jsのバージョン管理が出来るnodenvをanyenv経由でインストールします．

```bash
$ anyenv install nodenv
```

あらためてシェルを再読み込みし変更した設定を読み込みます．

```bash
$ exec $SHELL -l
```

anyenvとnodenv用のプラグインをセットアップできます．

- anyenv-update
    - anyenvプラグインでnodenvを含めたenv系環境をまとめてアップデートできます
- node-default-packages
    - nodenvプラグインでnpmインストール時にデフォルトでインストールしておくパッケージを指定できます．

```bash
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
$ mkdir -p "$(nodenv root)"/plugins
$ git clone https://github.com/nodenv/nodenv-default-packages.git "$(nodenv root)/plugins/nodenv-default-packages"
$ touch $(nodenv root)/default-packages
```

`$(nodenv root)/default-packages`を作成し、npmインストール時にデフォルトで入れるパッケージを指定する．

```
yarn
typescript
ts-node
typesync
```

これで、nodenvの設定も完了です．

最後に各設定ファイルの場所を確認しておきます．関連するファイルは下記の二箇所にあります．

```bash
$ ls ~/.anyenv
$ ls ~/.config/anyenv
```

# Node.jsのセットアップ

インストール可能なnodeのバージョンを確認します．

```bash
$ nodenv install -l
```

Nodeをバージョン指定でインストールします．

```bash
$ nodenv install 16.3.0
```

デフォルトで利用するNode.jsのバージョンが設定されていないと下記のようなエラーメッセージが出ます．デフォルトで利用するNode.jsのバージョンを`nodenv global <version>`で指定することでエラーメッセージは消えます．

```bash
$ node -v

nodenv: node: command not found

The `node' command exists in these Node versions:
  16.3.0
```

デフォルで利用するNodeのバージョンを指定します．

```bash
$ nodenv global 16.3.0
$ node -v
```

任意のディレクトリで使用するNodeのバージョを指定する場合は下記のようになります．下記では、まだインストールされていない、14.4.0をわざとして指定します．14.4.0はインストールしていないのでエラーが出ます．

```bash
$ nodenv local 14.4.0
nodenv: version `16.0.0' not installed
```

14.4.0をインストールします．

```bash
$ nodenv install 14.4.0

$ node -v
14.4.0
```

`nodenv local`を利用することで、今いるディレクトリ内において指定したバージョンのNode.jsが利用できるようになります．下記の例ですと`~/temp`ではnodeの14.4.0を利用するよう設定しています．`nodenv local`を利用すると、`.node-version`というファイルが作成され、その中に利用するバージョンが記載されます．

```bash
$ pwd
~/temp

$ nodenv local 14.4.0

$ ls
./		../		.node-version

$ cat .node-version
14.4.0
```

動作確認としてnodeのコマンドが実行出来るか確かめます．

```bash
$ node                                                                                     ✔  14.4.0   at 09:14:33 
Welcome to Node.js v14.4.0.
Type ".help" for more information.

> 1+1
2
> console.log('hello');
hello
```

`anyenv update`のコマンドをanyenvのプラグインとして追加しました．これを利用すると、Nodeの最新版を取得することが出来ます．実行しないと、`nodenv install -l`でインストール可能な最新のリストを取得できないので、Nodeを最新版にアップデートするときは`anyenv update`を実行します．

```bash
$ anyenv update
```

登録しているバージョンを確認したい場合は、`nodenv versions`を実行します．

```bash
$ nodenv versions                                                                                                   14.4.0
16.3.0 (set by ~/.anyenv/envs/nodenv/version)
```

また、登録しているバージョンの削除をしたい場合は`nodenv uninstall`を実行します．

```bash
$ nodenv uninstall 16.3.0 

nodenv: remove ~/.anyenv/envs/nodenv/versions/16.3.0? [yN] y
```

# おわりに

本記事ではmacOSでanyenvとnodenvを活用し、Node.jsを一つのPCで複数バージョン使える環境の構築手順を記載しました．

# 参考

1. [https://www.to-r.net/media/anyenv/](https://www.to-r.net/media/anyenv/)
2. [https://qiita.com/kyosuke5_20/items/eece817eb283fc9d214f](https://qiita.com/kyosuke5_20/items/eece817eb283fc9d214f)
3. [https://qiita.com/kyosuke5_20/items/220d62e7007ae51dbb52](https://qiita.com/kyosuke5_20/items/220d62e7007ae51dbb52)
4. [https://zenn.dev/ryuu/articles/use-anyversions](https://zenn.dev/ryuu/articles/use-anyversions)
5. [https://qiita.com/SUZUKI_Masaya/items/51366be1510f7fde7cdf](https://qiita.com/SUZUKI_Masaya/items/51366be1510f7fde7cdf)
6. [https://www.startappdevfrom35.com/anyenv_install/](https://www.startappdevfrom35.com/anyenv_install/)
7. [https://shinkufencer.hateblo.jp/entry/2018/11/22/233000](https://shinkufencer.hateblo.jp/entry/2018/11/22/233000)