【環境構築】zsh環境下でnvmをインストールしてプロジェクトの `.nvmrc` に応じてNode.jsのバージョンを自動で変える

Node.jsのバージョンを指定する `.nvmrc` があるリポジトリを触ることになったので `nvm` を導入してみました ☀️


## `anyenv` でインストールした `ndenv` をアンインストールする

`nvm` と `ndenv` は共存できなさそうなので、 `ndenv` を使っている場合は `ndenv` の方をアンインストールします。

```
anyenv uninstall ndenv
```

## `nvm` のインストール

`nvm` のインストールは次のコマンドを実行しますが、
`nvm` が更新されている場合があるので https://github.com/nvm-sh/nvm#install--update-script を参照してインストールのコマンドを確認しましょう。😳

```bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
```

実行したあとは `.zshrc` に次の行を追加します。

```
source ~/.nvm/nvm.sh
```

そして、新しく端末を開くか `(exec $SHELL -l)` を実行して `.zshrc` を読み込みます。


## Node.jsのインストール

まず、インストールできるNode.jsの一覧を表示します。

```bash
nvm ls-remote
```

バージョンを指定してNode.jsをインストールします。

```bash
nvm install v10.16.3
```

インストールしたNode.jsを使うには `nvm use <バージョン>` を実行します。

```
nvm use v10.16.3
```

## `.nvmrc` に応じてNode.jsを自動選択するレシピを導入する( `.zshrc` を分割する)

移動したディレクトリ(プロジェクト)に `.nvmrc` があると自動でNode.jsを選択するレシピが公開されています。

https://github.com/nvm-sh/nvm#zsh

インストールの方法ですが、

> Put this into your $HOME/.zshrc to call nvm use automatically whenever you enter a directory that contains an .nvmrc file with a string telling nvm which node to use:

とあり、 `.zshrc` に記述することになっています … **`.zshrc` が長くなると困りますよね？🤔** 

そこで `.zshrc` を分割しましょう😃
まず次のようなディレクトリ構成にします。

```
~/
└── .zshrc
└── ~/.zsh.d
    └── nvm-autoload.zsh
```

次に、 `~/.zsh.d/nvm-autoload.zsh` を作成して、次の順番の内容にします。

```:~/.zsh.d/nvm-autoload.zshで記述する内容
1. source ~/.nvm/nvm.sh
2. https://github.com/nvm-sh/nvm#zsh のレシピ(`# place this after nvm initialization!` と書いてあります)
```

最後に、 `~/.zshrc` を編集します。
`nvm` インストール時に追加した **`source ~/.nvm/nvm.sh` を削除してから** 次の内容を挿入します。(http://fnwiya.hatenablog.com/entry/2015/11/03/191902 と内容は同一です)

```:.zshrc
ZSHHOME="${HOME}/.zsh.d"

if [ -d $ZSHHOME -a -r $ZSHHOME -a \
     -x $ZSHHOME ]; then
    for i in $ZSHHOME/*; do
        [[ ${i##*/} = *.zsh ]] &&
            [ \( -f $i -o -h $i \) -a -r $i ] && . $i
    done
fi
```

## `.nvmrc` がない場所でデフォルトの Node.js を決める

これで `.nvmrc` の内容に応じて自動でNode.jsのバージョンが選択されますが、 `.nvmrc` がない場所ではどうなるのでしょうか。
**新しく端末を開くなどで `.nvmrc` がない場所に移動すると次のメッセージが表示されます**

**ディレクトリを移動して `.nvmrc` が見つからない度にこのメッセージが出る😖ので** これを修正しましょう。

```:.nvmrcがない場所で表示されるメッセージ
Reverting to nvm default version
N/A: version "default -> N/A" is not yet installed.

You need to run "nvm install default" to install it before using it.
```

メッセージや、先程配置したレシピの内容を見るとわかりますが `nvm use default` が実行されています☺️
`default` は `nvm` のエイリアスになっているため `default` が何なのかを `nvm alias` で設定します。

```bash
$ nvm alias default v10.16.3
default -> v10.16.3
```

間違えて設定してしまった場合は `nvm unalias` で削除できます😁

```bash
$ nvm unalias default
Deleted alias default - restore it with `nvm alias "default" "v10.16.3"`
```

設定されているaliasなどは `nvm ls` で確認できます。

```bash
$ nvm ls
       v10.16.3
node -> stable (-> v10.16.3) (default)
stable -> 10.16 (-> v10.16.3) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/dubnium (-> v10.16.3)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.16.1 (-> N/A)
lts/dubnium -> v10.16.3
```

## `.nvmrc` があるNode.jsプロジェクトに移動してみる

`.nvmrc` があるディレクトリに移動してみましょう。 
`nvm` でインストールしていないバージョンでも **自動でインストールして使ってくれます。便利！🤩**

```bash:nvmでインストールしていないバージョンを自動でインストール・選択する例
$ node -v
v10.16.3

$ cd awesome-project
Found '/Users/ysd/awesome-project/.nvmrc' with version <8.9.0>
Downloading and installing node v8.9.0...
Downloading https://nodejs.org/dist/v8.9.0/node-v8.9.0-darwin-x64.tar.xz...
######################################################################## 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v8.9.0 (npm v5.5.1)

$ node -v
v8.9.0
```


## 参考

ずっとUbuntu+zshでnvmを使いたかったんだよ!! - Qiita
https://qiita.com/Takumi_Kaibara/items/7c5e3ca735bc0167e83d

zsh設定ファイル（.zshrc）を分割する - fnwiya's quine
http://fnwiya.hatenablog.com/entry/2015/11/03/191902

nvmのデフォルトのバージョンの変え方 - Qiita
https://qiita.com/yuzooho/items/a5072ade3a0787640ef9