Linux Mint に asdf で Node.js をインストールする

# やりたいこと

いままで Node.js のバージョン管理には [n](https://github.com/tj/n) を使っていたのですが毎回使い方を忘れてしまう...。そこで似たようなツールがないか調べていたときに [asdf](https://github.com/asdf-vm/asdf) を見つけました。試しに使ってみたところ使い勝手が良く、他の言語（Go、Ruby、Python など。もっと沢山あります）もカバーしていることもあり、副次的に `rbenv`, `pyenv` なども使わなくて良くなりそうなので乗り換えることにしました。

本記事では Node.js をインストールした手順のみ残しておきます。

## 前提環境

実施した環境ということでご参考までに。Linux Mint は Ubuntu 互換のディストリビューションです。

| カテゴリ | ソフトウェア | バージョン |
|:---|:---|:---|
| OS  | [Linux Mint](https://linuxmint.com/)| 19 Tara Cinnamon x64 (Ubuntu 18.04 LTS ベース) |

# やってみた

## 1. asdf をインストール

[公式の手順](https://asdf-vm.com/#/core-manage-asdf-vm)を見ながら進めます。`git clone` するときにブランチを指定していますが削除します。指定しなければ最新が入ります。

```bash:bash
git clone https://github.com/asdf-vm/asdf.git ~/.asdf # ブランチを指定しなければ最新が入ります
```

### `bash` で `asdf` を使う場合

```bash:bash
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
```

`asdf` コマンドを実行してインストールされたかを確認。

```bash:bash
asdf -v
```

```text:実行結果
version: v0.7.0
```

### `fish` で `asdf` を使う場合

私は fish を使っているのでこちらを実行。

```bash:fish
echo 'source ~/.asdf/asdf.fish' >> ~/.config/fish/config.fish
mkdir -p ~/.config/fish/completions; and cp ~/.asdf/completions/asdf.fish ~/.config/fish/completions
```

・・・ただ、`bash` から :arrow_up: のコマンドを実行する必要があったので `bash` で下記を実行しました。

```bash:bash
# fish で asdf を使う。
echo 'source ~/.asdf/asdf.fish' >> ~/.config/fish/config.fish
mkdir -p ~/.config/fish/completions
cp ~/.asdf/completions/asdf.fish ~/.config/fish/completions
```

`asdf` コマンドを実行してインストールされたかを確認。

```bash:bash
asdf -v
```

```text:実行結果
version: v0.7.0
```

うまく動かないときはターミナルを再起動してください。

## 2. asdf のプラグインと依存関係があるパッケージをインストール 

公式の [Plugin Dependencies](https://asdf-vm.com/#/core-manage-asdf-vm?id=plugin-dependencies) でプラグインの依存関係としてインストールしておいた方が良いパッケージが案内されているため追加でインストールします。公式は `apt` コマンドですが `apt-get` に変えています。

```bash:bash
sudo apt-get install -y \
  automake autoconf libreadline-dev \
  libncurses-dev libssl-dev libyaml-dev \
  libxslt-dev libffi-dev libtool unixodbc-dev
```

## 3. asdf で Node.js をインストール

Node.js のバージョンは推奨版（LTS）をインストールします。現在のバージョンが何かは[公式のページ](https://nodejs.org/ja/)で確認します。

<img src="https://docs.google.com/drawings/d/e/2PACX-1vTycH3TJtCnIwT1EIOjtrOB65pYRWLVHuE1boe74pafHBAMJZIFvCZfJ5l1xZAESeJ3u71bZBrfng4-/pub?w=757&amp;h=586">

バージョンが確認できたら Node.js をインストールします。

<font color=red>※ `asdf plugin-add nodejs` だけだとインストールするときのコマンド（`asdf install nodejs 10.15.2`）でエラーになります。</font>調べてみたところ、[asdf-nodejs](https://github.com/asdf-vm/asdf-nodejs) に記載されている手順でインストールする必要があります。Ruby や Python では必要なかったんですけどね...。

```bash:bash
# apt の Node.js はアンインストール
sudo apt-get remove -y nodejs

# asdf-nodejs で案内されているパッケージを追加
sudo apt-get install -y gpg dirmngr

# Node.js をインストールできるように asdf のプラグインを追加（asdf-nodejs.git から引っ張ってくる）
asdf plugin-add nodejs https://github.com/asdf-vm/asdf-nodejs.git
bash $HOME/.asdf/plugins/nodejs/bin/import-release-team-keyring

# asdf でバージョンを指定して Node.js をインストール
asdf install nodejs 10.15.2
```

```text:実行結果
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3884    0  3884    0     0   3606      0 --:--:--  0:00:01 --:--:--  3606
gpg: 2019年02月28日 21時43分40秒 JSTに施された署名
gpg:                RSA鍵DD8F2338BAE7501E3DD5AC78C273792F7D83545Dを使用
gpg: "Rod Vagg <rod@vagg.org>"からの正しい署名 [不明の]
gpg:                 別名"Rod Vagg <r@va.gg>" [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:          この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: DD8F 2338 BAE7 501E 3DD5  AC78 C273 792F 7D83 545D
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17.7M  100 17.7M    0     0  3226k      0  0:00:05  0:00:05 --:--:-- 4436k
node-v10.15.2-linux-x64.tar.gz: OK
```

インストールしたバージョンにパスを通して使えるようにします。

```bash:bash
asdf global nodejs 10.15.2
asdf reshim nodejs
```

インストールされたのか確認。

```bash:bash
node -v
```

```text:実行結果
v10.15.2
```

`npm` コマンドも使えるようになっているか確認。

```bash:bash
npm-v
```

```text:実行結果
6.4.1
```

# おまけ

## yarn をインストールしたいとき

通常通り `npm` コマンドでグローバルにインストールできます。

```bash:bash
npm i -g yarn
```

`yarn` コマンドが使えるようになっているか確認。

```bash:bash
yarn -v
```

```text:実行結果
1.13.0
```

ただし、`asdf` で別のバージョンの Node.js をインストールした場合はインストールし直しになります。
例: `10.15.2` の `yarn` と `10.15.3` の `yarn` は別々にインストールする必要があります。

## asdf のバージョンを上げたいとき

```bash:bash
asdf update
```

## asdf で Node.js のバージョンを上げたいとき

インストール可能なバージョンの一覧を確認します。

```bash:bash
asdf list-all nodejs 
```

```text:実行結果
0.10.0
0.10.1
0.10.2
0.10.3
0.10.4
0.10.5
0.10.6
0.10.7
==================== 中略 ====================
10.15.2
10.15.3
11.0.0
11.1.0
11.2.0
11.3.0
11.4.0
11.5.0
11.6.0
11.7.0
11.8.0
11.9.0
11.10.0
11.10.1
11.11.0
```

いま見ると `10.15.3` リリースされてますね。アップデート早いなぁ :sleeping: ← [Release スケジュール](https://github.com/nodejs/Release) 見てない...

```bash:bash
# 指定されたバージョンをインストール
asdf install nodejs 11.11.0
```

```text:実行結果
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4229    0  4229    0     0   4532      0 --:--:-- --:--:-- --:--:--  4527
gpg: 2019年03月07日 04時30分52秒 JSTに施された署名
gpg:                RSA鍵A48C2BEE680E841632CD4E44F07496B3EB3C1762を使用
gpg: "Ruben Bridgewater <ruben@bridgewater.de>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:          この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: A48C 2BEE 680E 8416 32CD  4E44 F074 96B3 EB3C 1762
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 19.4M  100 19.4M    0     0  3902k      0  0:00:05  0:00:05 --:--:-- 4741k
node-v11.11.0-linux-x64.tar.gz: OK
```

```bash:bash
# 指定のバージョンが使えるようにパスを通す
asdf global nodejs 11.11.0
asdf reshim nodejs
node -v
```

```text:実行結果
v11.11.0
```

## 所感

- 開発言語のバージョン管理をするのであれば `asdf` は鉄板という印象。
- 複数言語を使う人には尚オススメ。
- というよりも、バージョン管理をしなくても `asdf` を入り口にインストールする方が分かりやすいのではないか :smile_cat: