Homebrew 経由の anyenv 経由の nodenv 経由で Node.js をインストールする

:::note info
anyenv から asdf に乗り換えて、新しく記事を書きました。
:::

https://qiita.com/ucan-lab/items/0b854cfaa9d7c8ede106

---

Node.jsをインストールしたい場合、公式サイトから直接インストールしても問題ありませんが、複数のプロジェクトで異なるバージョンが使われているとバージョン切り替え等の管理が煩雑になってしまいます。

よりお手軽にバージョン切り替えする方法を模索したいと思います。

### Node.js 管理ツール多すぎ問題

- [公式のインストーラ](https://nodejs.org/ja) を使う場合
- [Homebrew](https://brew.sh/index_ja) 経由でインストールする場合
- [nodist](https://github.com/nullivex/nodist) 経由でインストールする場合
- [nvm](https://github.com/nvm-sh/nvm) 経由でインストールする場合
- [nodebrew](https://github.com/hokaccha/nodebrew) 経由でインストールする場合
- [ndenv](https://github.com/riywo/ndenv) 経由でインストールする場合
- [nodenv](https://github.com/nodenv/nodenv) 経由でインストールする場合
- [anyenv](https://github.com/anyenv/anyenv) 経由でインストールする場合 (当記事)

いや、多すぎんだろ！！😱

## 各Node.js管理ツールの問題

### 公式のインストーラ & Homebrew 経由でインストールした時の問題

- 複数のNodeバージョンをインストールできない。

複数のプロジェクトでNodeのバージョンが異なってたら切り替えがめんどくさい😡

### nodist 経由でインストールした時の問題

- nodistはWindows用のツールだった😣

### nodebrew & nvm 経由でインストールした時の問題

複数のNodeバージョンをインストールできるようになりました。

- `nodebrew use <version>`, `nvm use <version>` でバージョン切り替えがめんどくさい

再インストールする必要はないが、コマンドを打つのでさえめんどくさい😇

### ndenv 経由でインストールした時の問題

`.node-version` ファイルが配置されていれば自動でバージョン切り替えできる😍

- パッケージが非推奨になった😭
- `nodenv` がオススメだよと教えてもらう

### nodenv 経由でインストールした時の問題

デフォルトパッケージプラグインもあって `nodenv` めがっさ便利☺️

- [nodenv](https://github.com/nodenv/nodenv), [goenv](https://github.com/syndbg/goenv), [phpenv](https://github.com/phpenv/phpenv), [pyenv](https://github.com/pyenv/pyenv), [rbenv](https://github.com/rbenv/rbenv)... ***env何個あるねん！
- `~/.zshrc` の初期設定がかさばる問題
  - 複数の `**env` ツールを入れない場合は良いと思う

### anyenv 経由でインストールした時

🥰

## 既にNode.jsが入っている人

こちらの記事を参考にアンインストールしてクリーンな状態にしてください。

- [Node.js を完全にアンインストールする](https://qiita.com/ucan-lab/items/a662532f1ce46f152c4e)

## インストールの流れ

1. Homebrewのインストール
2. anyenvのインストール
3. nodenvのインストール
4. Node.jsのインストール

Homebrew 経由の anyenv 経由の nodenv 経由で Node.js をインストールします。。

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

- https://brew.sh/index_ja
- macOS用パッケージマネージャー
- コマンドラインで実行できてパッケージ間の依存関係も解決してくれる

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

- https://github.com/anyenv/anyenv
- 様々な `**env` 系ツールをまとめて管理する

```
$ brew install anyenv
$ anyenv install --init
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
$ exec $SHELL -l

$ anyenv -v
anyenv 1.1.1
```

## anyenv-update プラグイン をインストールする

- https://github.com/znz/anyenv-update
- `**env` 系ツールを一括アップデートするプラグイン


```
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
```

### 使い方

```
$ anyenv update
$ nodenv install -l
```

`anyenv`, `anyenv` のプラグイン, `**env`, `**env` プラグインをまとめてアップデートしてくれます。

- `nodenv install -l` 等でインストールしたいバージョンが見つからなかった時に実行してください。

## anyenv-git プラグイン をインストールする

- https://github.com/znz/anyenv-git

```
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-git.git $(anyenv root)/plugins/anyenv-git
```

### 使い方

```
* anyenvでインストールした全ての**env系とインストールされているプラグインのアップデート
$ anyenv git pull
* ガベージコレクション(ゴミファイルの削除)
$ anyenv git gc
* 全てのリモートリポジトリを表示
$ anyenv git remote -v
* gitのステータス表示
$ anyenv git status
```

`**env`, `**env` のプラグインの `git` 操作をまとめて実行できます。

## anyenv でインストール可能なenv系一覧

```
$ anyenv install -l
  Renv
  crenv
  denv
  erlenv
  exenv
  goenv
  hsenv
  jenv
  luaenv
  nodenv
  phpenv
  plenv
  pyenv
  rbenv
  sbtenv
  scalaenv
  swiftenv
  tfenv

# anyenv でインストールしたenvツールの一覧
$ anyenv versions
```

## anyenv 経由で nodenv をインストールする

- https://github.com/nodenv/nodenv
- 複数のNode.jsのバージョンを管理する

```
$ anyenv install nodenv
$ exec $SHELL -l
```

## nodenv-default-packages プラグイン

- `nodenv install <バージョン番号>` の時に指定したパッケージをグローバルインストールする

```
$ touch $(nodenv root)/default-packages
```

### 使い方

```
$ vim $(nodenv root)/default-packages
typescript
```

## nodenv 経由で Node.js をインストールする

- https://nodejs.org/ja

```
$ nodenv install -l

$ nodenv install 13.11.0
$ nodenv global 13.11.0

$ node -v
v13.11.0
$ npm -v
6.13.7
```

### 特定のディレクトリだけNodeバージョンを切り替える

```
$ nodenv install 10.13.0
$ mkdir testdir
$ cd testdir
$ nodenv local 10.13.0

$ node -v
v10.13.0
$ npm -v
6.4.1
```

`nodenv local x.x.x` を実行すると `.node-version` ファイルが作成される。

```
$ cat .node-version
10.13.0
```

プロジェクトルートに配置しておけば、自動的にバージョンを切り替えてくれる。

### nodenv-default-packages 後からパッケージをグローバルインストール

```
# 指定したバージョンにパッケージをグローバルインストールする
$ nodenv default-packages install 10.13.0

# すべてのバージョンにパッケージをグローバルインストールする
$ nodenv default-packages install --all
```

## 2020.03.22 追記: asdf-vm

Twitterで[asdf-vm](https://github.com/asdf-vm/asdf) というツールを教えてもらいました！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">anyenvでファイナルアンサー、なところにasdfという追加の選択肢を投げつけていきたい <a href="https://t.co/oBvXuTqFd2">https://t.co/oBvXuTqFd2</a></p>&mdash; n (@n_1215) <a href="https://twitter.com/n_1215/status/1241615762902540290?ref_src=twsrc%5Etfw">March 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

anyenv > nodenv と経由の必要がなく、
対応している言語(MySQL等の言語以外も)も多いようです。

また、 `.tool-versions` ファイルを dotfiles で管理していれば `asdf install` で全部よしなにインストールしてくれます。

とても便利そうなので、使ったらasdfの記事を書きたいと思います...!