pkg で node.js を入れたMacで、node.js を消さずに nodebrew + avn を入れようとしたらうまくいかなかったときのメモ

Node.js 7系以下が必要なプロジェクトがあり、node.js のバージョンを切り替える必要があったので nodebrew + avn を使うことにしたときのメモ。
うまくいかなかった時に試したことを一応自分用にメモしておくのがこの記事の目的なので、すっきりわかりやすい記事をご希望の場合は最終項の参考記事を参考にするのが良いかと思います。

# 1. 方法
## 前提
- Mac
- Node.js を[インストーラー](https://nodejs.org/ja/)からインストール済み
- nodebrew を homebrew でインストール済み

## nodebrew と avn
- nodebrew だけでも node.js のバージョンは切り替えられる
- avn を使えば、プロジェクトのルートディレクトリに置いた `.node-version` のバージョンに合わせて node.js のバージョンを切り替えてくれる

その他切り替える方法として anyenv （参考 https://www.to-r.net/media/anyenv/ ）というのもあるらしいです。

## 手順

1. グローバルにavnとavn-nodebrewをインストール＆セットアップする。

```bash:terminal
npm install -g avn avn-nodebrew
avn setup
```

2. プロジェクトのルートディレクトリに `.node-version` を作成する。
作成したファイルには使いたい node.js のバージョンを以下のようにセマンティックバージョニングで書く。

```text:.node-version
v6.17.1
```

3. ターミナルでプロジェクト内に `cd` で移動して、以下のように `activated` が表示されていればOK。

```bash:terminal
avn activated v6.17.1 (avn-nodebrew v6.17.1)
```

# 2. Trouble Shooting
だいぶ完結に「1.」にまとめましたが、実際は結構時間がかかりました。
やったことで覚えていることを時系列に関係なくメモだけしておきます。

## `node -v` をして確認したら切り替わってなかった

↑のようにバージョンが変わったように思ったけど、 `node -v` で念のためバージョンを確認すると変わっていなかった...。
とりあえず、 一旦全部削除してみようと思い、一からやり直してみた。

```bash:terminal
v10.17.0
```

### pkg で入れた node.js を削除（ついでに npm も削除）
[MacにpkgでインストールしたNode.jsをアンインストールする手順](https://qiita.com/yoshikoba/items/4906829faaaae8c73e56)を参考に削除。
以下を一行ずつ実行していく。（>がでてきても次の行を>につづけてペーストしてenterを押す）

```bash:terminal
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.node.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
```

npm も削除する場合は以下で。

```bash:terminal
sudo rm -rf ~/.npm
```

node.js、npm が削除されてるかどうかは以下のコマンドでチェック（バージョンがでてこなければOK）

```bash:terminal
node -v
npm -v
```

### nodebrew を入れ直してみる

#### nodebrew を削除する
[Nodebrew本体を削除する方法](https://qiita.com/tonkotsuboy_com/items/f5d17f0b9698554a7716)を参考に Finder or ターミナルから直接 `.nodebrew` ディレクトリを削除。
（隠しファイルの表示方法は[こちら](https://qiita.com/shosho/items/ed8b534b4dcd81770f2f)）

ただ、homebrew で nodebrew を入れた場合は上記じゃ消せないときがあるので、その場合は下記のコマンドで削除。

```bash:terminal
brew uninstall nodebrew
```

#### nodebrew を入れ直す
[GitHubページ](https://github.com/hokaccha/nodebrew)の通り、curlコマンドでインストール。
（homebrew でも入れれますが、削除するときにちょっと面倒だったのでcurlで入れました）

```bash:terminal
curl -L git.io/nodebrew | perl - setup
```

インストールしたら、パスを通す。（GitHubページには `.bashrc` or `.zshrc` と書かれてます）
私は `.bashrc` に書きました。

```.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

bashrcを更新しても、ターミナルを再起動しただけではシェルの設定が反映されないので、以下のコマンドを叩いて反映させる。

```bash:terminal
source ~/.bashrc
```

##### ！！注意！！
上記を実行しただけだと
「PhpStormのTerminalでは nodebrew コマンドが使えるのに、App のターミナルで新しいタブを開いても nodebrew コマンドが使えない...」
という状況に陥りました。

これは実行系統によって読み込む設定ファイルが微妙に異なることが原因だそう。（両者のターミナルで読み込む設定が違ったみたい）
そこで、 `.bashrc` の更新内容が今後自動的に `.bash_profile` に反映されるようにするため、 `.bash_profile` に下記コマンドを追加するとどちらでも nodebrew コマンドが使えるようになりました。

```txt:.bash_profile
source ~/.bashrc
```

（↓あたりを参考に）
https://qiita.com/hiesiea/items/860c42a96b031f929b94
https://qiita.com/magicant/items/d3bb7ea1192e63fba850

## `avn could not activate node v6.17.1` と出る

nodebrew に activate したい node.js がインストールされていないのが原因でした。

### nodebrew にインストール済みのバージョンの確認
```bash:terminal
nodebrew ls
```

### nodebrew にバージョンをインストールする
```bash:terminal
nodebrew install-binary 6.17.1
```

## 参考
[avnのGitHubページ](https://github.com/wbyoung/avn)
[Nodebrewとavnを使ってNode.jsのバージョン切り替えを自動化する](https://qiita.com/kc7891/items/435bf552cf221ed9d329)
[ディレクトリごとに異なるバージョンのnodeを使いたいのでavnを使った話](https://qiita.com/jigengineer/items/6689ed1523335a6c6d43)