🔖

WSL2で nvm による NodeJS のインストールとバージョン管理

2022/01/29に公開

1. 前置き

1.1. NodeJS のインストールにはバージョン管理ツールを使う

どのOSを使うにせよ、NodeJS インストール手順を抽象化すると次のようになる。

  1. まず、Node用の「バージョン管理ツール」をインストール
  2. 次に、「バージョン管理ツール」を用いて NodeJS をインストール

NodeJS を導入したいなら、いくつか存在するNode用バージョン管理ツールのうち、どれかを選んで用いるのが望ましい。

1.2. Node用バージョン管理ツール、nvm

いくつか存在するバージョン管理ツールのうち、もっとも高い人気を誇る nvm(Node Version Manager) を用いる。今回は、記事執筆時点で最新の v0.39.1 を使用。

次に挙げるwebページがnvmのリポジトリで、インストール方法をはじめ、詳しい使用法など、必要な情報は全て載っているはず。本稿は、そのページのドキュメントから、私が必要な部分を選んで書き直しただけのものだ。
nvm: Node Version Manager (https://github.com/nvm-sh/nvm)

1.3. 用いる環境

次の様な状態の WSL2(Ubuntu) にインストールする。

powershell; wsl のバージョン等
> wsl --status
既定の配布: Ubuntu
既定のバージョン: 2
Linux 用 Windows サブシステムの最終更新日: 2021/11/30
WSL の自動更新が有効になっています。
カーネル バージョン: 5.10.60.1
ubuntu; ubuntu のバージョン
$ cat /etc/issue
Ubuntu 20.04.3 LTS \n \l

2. nvm (バージョン管理ツール)インストール

2.1. cURL(curl) の存在確認、無ければインストール

curl コマンドを利用するので、まずコマンドの存在を確認し、無ければインストールする。

ubuntu; curl の存在を確認
$ command -v curl  # curl の存在確認
/usr/bin/curl      # 存在するなら左記のようにコマンドのパスが出力される。
                   # 何も出力されなければ下記の様にインストール
ubuntu; curl が無ければインストール
$ sudo apt install curl  # もし存在しなかったらインストール

2.2. スクリプトによるインストール(アップデート)

GitHub にある nvm のリポジトリの、Installing and Updatingという項目の一番最初には、install.sh(インストール・スクリプト)によるインストール方法が説明されている。
ちなみにアップデートも同じ方法で可能。

具体的には次の様なコマンドでスクリプトを実行する。ただし、バージョンを表す文字列部分(ここではv0.39.1)が、バージョンアップに合わせて変わっていくと思われるので、最新のコマンドを知るにはリポジトリに示されているものを確認する必要がある。

ubuntu; install.sh 実行例
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

2.3. nvm の存在確認

ubuntu; nvm の存在確認
$ source ~/.bashrc # nvm をインストールしたことによる .bashrc の変更を適用
$ command -v nvm   # nvm 存在確認
nvm                # 上記コマンドの実行で左記のように出力されればOK

2.4. nvm のインストールで生じる変化

2.2におけるinstall.shの実行により次の変化が生じている。

  • ~/.nvm/ディレクトリが作られ、そこに nvm リポジトリが clone される。なお、今後nvmを使ってインストールする NodeJS は、~/.nvm/の下にバージョン単位で別々にインストールされる。
  • ~/.bashrcの末尾に次の3行が追加される
~/.bashrc 末尾
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

ちなみに、3行目により、nvm の各種コマンド入力を tab で補完できるようになっている。

2.5. nvm のアンインストール

nvmのインストールによって生じた変化を取り消せばnvmをアンインストールできる。具体的には次の2点を行う:

  1. .nvmディレクトリの削除 (nvm でインストールされていた node がすべて消える)
  2. .bashrcに追加された3行を削除
ubuntu; nvm アンインストールに必要な2つの作業
$ rm -rf "$NVM_DIR"  # $NVM_DIR は ~/.nvm のことであるはず
$ vim ~/.bashrc      # 下記の3行を消すため、.bashrc を編集
~/.bashrc の削除対象
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

3.0 nvm で NodeJS インストール

3.1. 前提知識(バージョンのエイリアス等)

3.1.1. バージョンの指定方法とエイリアス

nvm における NodeJS のバージョンは、16.13.0のように数値で表すほか、次の様にエイリアスで表すこともできる。

node   # その時点での最新バージョンを表すエイリアス
lts/*  # その時点での LTS の最新バージョンを表すエイリアス
--lts  # nvm コマンドの引数にこれを使うと、上と同じく LTS の最新バージョンが指定される。
ubuntu; バージョンのエイリアス一覧を表示
$ nvm alias  # バージョンのエイリアス一覧を表示

3.1.2. バージョンの一覧表示

ubuntu; バージョンの一覧表示
$ nvm ls         # すでにインストールされているバージョンの一覧
$ nvm ls-remote  # インストール可能な全バージョンの一覧

3.2. node のインストール

nvm install <バージョン指定>でインストール。
複数のバージョンをインストールでき、/.nvm/ディレクトリの下にバージョンごとに別々にインストールされる。
また、インストールされる node のバージョンにおける最新のnpmが、そのバージョンに紐づけられた状態で自動的にインストールされる。

utunbu; nvm による node のインストール
$ nvm install node    # 最新バージョンをインストール
$ nvm install --lts   # LTS の最新バージョンをインストール
$ nvm install 'lts/*' # 同上
$ nvm install 16.13.0 # 指定したバージョン(この場合はv16.13.0)をインストール

3.3. node のアンインストール

ubuntu; nvm による node のアンインストール
$ nvm uninstall 16.13.0 # 指定したバージョン(この場合はv16.13.0)をアンインストール

ただし、後述する「current バージョン」に指定されているバージョンは、uninstall できない。

4.0 nvm によるバージョン管理

4.1. current バージョンの確認

nvm currentコマンドで現在使用中の node のバージョン(=current バージョン)が出力される。

ubuntu; node の current バージョンを確認
$ nvm current  # current バージョン(いま使用中であるnodeのバージョン)の確認
v16.13.0       # 出力の例
$ node -v      # node の方からも確認
v16.13.0       # 出力の例

current バージョンを変えるにはnvm useコマンドを使う。
また、.nvmrcファイルと組み合わせれば、プロジェクト単位のバージョン管理を便利に行うことができる。
以下に詳述。

4.2. nvm use コマンドによるバージョン切り替え

nvm use <バージョン指定> で、インストール済みバージョンの中から新たな current バージョンを指定する。
npmのバージョンも、current バージョンに紐づけられたものに自動的に切り替わる。

ubuntu; nvm use で current バージョンを指定
$ nvm use node    # 最新バージョンを current バージョンにする
$ nvm use --lts   # 最新の LTS を current バージョンにする
$ nvm use 16.13.0 # 指定したバージョン(この場合はv16.13.0)を current バージョンにする

4.3. nvm install による自動的なバージョン切り替え

なお、nvm installを行うと、インストール終了時、今インストールしたバージョンが current に指定される。

ubuntu; nvm install による自動的なバージョン切り替え
$ nvm install 16.13.1                # v16.13.1 をインストールすると...
Downloading and installing node v16.13.1...
Downloading https://nodejs.org/dist/v16.13.1/node-v16.13.1-linux-x64.tar.xz...
#################################(略)################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v16.13.1 (npm v8.1.2)  # v16.13.1 が自動的に current になる。

4.4. .nvmrc を使ったプロジェクトごとのバージョン管理

とあるディレクトリに.nvmrcというファイルを置き、それに node の特定のバージョンを記述しておく。
そうした時、そのディレクトリでnvm installnvm useをバージョン指定なしで使うと、.nvmrcの記述を参照して自動的にコマンドの対象となるバージョンが指定される。

この仕組みを利用することで、特定バージョンを記述した.nvmrcをプロジェクトルートに置いておけば、プロジェクト単位でのバージョン統一が簡単になる。

手順1 .nvmrc にバージョンを記述

次のようにして特定のバージョンが記述された.nvmrcファイルを新規作成、または上書きできる。上述のエイリアスも使える。

ubuntu; 特定のバージョンが記述された .nvmrc を作る(上書きする)例
$ echo "16.13.0" > .nvmrc   # 16.13.0 と書かれた.nvmrcを作成, 上書きも同様
$ cat .nvmrc                # 確認
16.13.0                     # 出力

手順2 .nvmrc の記述を参照したバージョン切り替え

nvm installnvm useをバージョン指定なしで使うと、今いるディレクトリで.nvmrcの自動探索が行われる。
もし存在すれば、それに記述された文字列を対象バージョンとしてコマンドが実行される。
ファイルが存在しなかったり、バージョンが不適切だったりすると、エラーになる。

ubuntu; .nvmrc が存在するディレクトリにて
$ nvm install  # .nvmrc に記述されたバージョンの node をインストール
$ nvm use      # .nvmrc に記述されたバージョンの node を current バージョンにする

4.5. 使用例: プロジェクトDir作成から npm init 開始まで

ubuntu; nvm 使用例
$ mkdir newProject && cd $_   # 新プロジェクト用ディレクトリを作り、入る。
$ echo "16.13.2" > .nvmrc     # このプロジェクトでは v16.13.2 を使うことにする。
$ nvm install                 # インストール済みか否かは気にせず install.
Found '/home/(略)/newProject/.nvmrc' with version <16.13.2> # .nvmrc が参照された。
v16.13.2 is already installed.       # インストール済みでもエラーにならない。
Now using node v16.13.2 (npm v8.1.2) # 16.13.2 が自動で current バージョンに。
$ npm init -y                 # package.json を作り、開発環境づくりを始めることにする。

Discussion