n (Node.js管理) のインストール手順

# n
nvmやnodebrewなどと同じく、Node.jsのバージョン管理ツールの1つです。

https://github.com/tj/n

## 対象読者
・MacOSユーザー
※nはWindowsをサポートしていません。

## 前提
### Homebrewがインストール済み

インストール済みの場合は、バージョンが表示されます。

``` sh
$ brew -v
Homebrew 3.0.4
```

バージョンが表示されなかった方は、インストールを行います。

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


### インストール
brewコマンドを使って、nをインストールします。

```sh
brew install n
```

### バージョンの確認
コマンドを実行しバージョンが表示されれば、正常にインストールされています。

```sh
$ n -V
7.0.0
```

## Node.js LTS版のインストール
試しにNode.jsのLTS(最新安定版)をインストールしてみます。

### 準備
nはデフォルトで`/usr/local`以下に、`n/versions`ディレクトを作成し、そこでバージョンを管理を行います。

`/usr/local`以下はroot権限のディレクトリに該当し、通常ユーザーではアクセスできないディレクトリです。

nコマンドでNode.jsをインストールする前に、以下のいずれかの対応が必要です。

1. sudo コマンド で実行
2. 環境変数 `N_PREFIX`に、ホームディレクトリなどをインストール先を指定
3. `/usr/local/n` を作成し、ユーザーの読み取り権限を付与

今回は、nコマンド実行時に毎回sudoを叩きたくない&環境変数を増やしたくないので、
`3./usr/local/n を作成し、ユーザーの読み取り権限を付与`を行います。

``` sh
# make cache folder (if missing) and take ownership
$ sudo mkdir -p /usr/local/n
$ sudo chown -R $(whoami) /usr/local/n
```

[README.md](https://github.com/tj/n#user-content-installation)から引用


### LTSのバージョン確認
インストールコマンドを叩く前に、LTSのバージョンを確認します。

``` sh
$ n --lts
14.16.0
```

### インストール
nコマンドの引数にltsを渡して実行します。

``` sh
$ n lts
```

正常にインストールされると以下のような表示となります。

``` sh
  installing : node-v14.16.0
       mkdir : /usr/local/n/versions/node/14.16.0
       fetch : https://nodejs.org/dist/v14.16.0/node-v14.16.0-darwin-x64.tar.xz
   installed : v14.16.0 (with npm 6.14.11)
```

#### 失敗した場合
権限が無いと以下の通り怒られるので、権限付与のコマンドを実行して再実行するか、管理者権限で実行してください。

``` sh
  installing : node-v14.16.0
       mkdir : /usr/local/n/versions/node/14.16.0
mkdir: /usr/local/n/versions/node/14.16.0: Permission denied

  Error: sudo required (or change ownership, or define N_PREFIX)
```

## Node.js 最新版のインストール
※LTS版ではなく、最新版を使いたい場合はこちら

### 最新バージョンの確認

``` sh
n ls-remote latest
```

### インストール
引数にlatestもしくは、current を渡して実行します。

``` sh
$ n latest
## もしくは
$ n current
```

## Node.js バージョン指定してインストール

### インストール可能なバージョンを確認

``` sh
# インストール可能なバージョンを表示(最新から20件)
$ n lsr 

# 全てのインストール可能なバージョンを表示
$ n --all lsr
```

### インストール
一覧に表示された中から、インストールしたいバージョンを引数で指定します。

``` sh
$ n 15.10.0
```

## バージョンの切り替え
すでにインストールしている中から、自由に切り替えることができます。

``` sh
$ sudo n
```

nコマンドを実行するとインストール済みのバージョン一覧が表示されます。
上下キーでバージョンを選択し、Returnキーで切り替えることが可能です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738154/6584e6b4-5913-54d1-13ea-79bb67baf8ea.png)

正常に切り替わると以下のように表示されます。

``` sh
  installed : v14.16.0 (with npm 6.14.11)
```

### 失敗した場合
以下のようにズラズラ〜っとPermission deniedが出たあとに、
installedが表示された場合は正常に切り替わっていません。

sudoでnコマンドを実行し直してください。

``` sh
cp: /usr/local/lib/node_modules/npm/lib/uninstall.js: Permission denied
cp: /usr/local/lib/node_modules/npm/.mailmap: Permission denied
cp: /usr/local/lib/node_modules/npm/.travis.yml: Permission denied
cp: /usr/local/lib/node_modules/npm/tap-snapshots/test-tap-fund.js-TAP.test.js: Permission denied
cp: /usr/local/lib/node_modules/npm/tap-snapshots/test-tap-repo.js-TAP.test.js: Permission denied
cp: /usr/local/lib/node_modules/npm/.licensee.json: Permission denied
  installed : v14.16.0 (with npm 6.14.11)
```

## (おまけ) nコマンドでsudoしたくない人向け
以下のコマンドでユーザーに権限を付与することでsudoが不要になります。

``` sh
# take ownership of node install destination folders
sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share
```
[README.md](https://github.com/tj/n#user-content-installation)から引用

## 感想
`n`の一文字だけでスマートにNode.jsのバージョンを切り替える事がメリットだと感じました。

ただし、切り替え速度に関して、自環境ではバージョン切り替えが完了するまで、8~10秒くらいかかりました。※環境に左右されると思います。

バージョン切替時の処理内容が、`/usr/local/lib/node_modules/npm`以下を全削除したあと、
指定のバージョンのNode.jsを入れ直しているため、そのぶん時間がかかってると思われます。

少し切替速度は気になりましたが、`n`コマンドでスマートにバージョン切り替えをしてみたいという方は、ぜひ参考にしてみてください。