一時期ローカルPCにインストールされたNode.jsのバージョンを切り替えるツールが乱立してどれを選べばいいの状態で、当然オプションも違うのでOSによって違うツールが入っているとオプションを覚えるのがしんどい状況でした。
面倒臭がりとしては、どのOSでNode.jsのバージョンを切り替える時も、同じコマンドで切り替えたいのです。
因みにバージョン切り替えツールに望む個人的な要望は以下の4つです。これだけ叶えてくれれば文句はありません。
- 指定バージョンのNode.jsをダウンロード出来る
- ローカルPCにインストールされているNode.js一覧を出してくれる
- 指定バージョンのNode.jsに切り替えてくれる
- ダウンロード出来るNode.jsのバージョンを教えてくれる
数あるバージョン切り替えツールの中「nvm」を使うと、異なるOSで、同じコマンドで、これらを実現することが「かろうじて」可能です。
鬼門はWindowsです。
目次
Node.jsバージョン切り替えツールのシェア
Googleトレンドで見る限り、世界的にはずっとnvm(Node.js Version Manager)の一人勝ち。
範囲を日本に限るとnodebrew、nodistの存在が見えてきます。でもやっぱりnvmの方が上。
じゃあもうnvmで統一しよう、と思ってもWSLの無い環境やWindows8.1などではcygwin装備状態でもnvmは動いてくれません。
Windowsでnvmを使う為の解決策として「nvm-windows」という明らかにnvmリスペクトだけど、クローンという訳でもなく結構独自路線を行っちゃっているゴーイングマイウェイなツールを採用します。
Mac OS X、Linuxにnvmをインストール
nvmの公式github手順でインストール。
MacとLinuxの入れ方は同じです。(Mac OS X 10.14.4、CentOS 7.6使用)
install.shを取ってきてbashにパイプするだけです。
(0.34.0になった時点でリポジトリ名が変わりました)
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
インストール後、再ログインしなおすか、source .bashrcするとnvmコマンドが使えるようになります。
因みにnvmはコマンドではなくシェル関数としてロードされます。ログイン時に.bashrcから$HOME/.nvm/nvm.shが読み込まれることで、定義済みシェル関数として使えるようになります。
[naka@spock ~]$ declare -f | less
(snip)
nvm () <-- シェル関数
{
if [ $# -lt 1 ]; then
nvm --help;
return;
fi;
local DEFAULT_IFS;
DEFAULT_IFS=" $(nvm_echo t | command tr t \\t)
";
if [ "${IFS}" != "${DEFAULT_IFS}" ]; then
IFS="${DEFAULT_IFS}" nvm "$@";
return $?;
fi;
local COMMAND;
which nvmしても出てこないので、入ったかどうか確かめる時はnvm –versionすればOKです。
MacでCommand Not Foundになる時は.bashrcを読めていないので、.bash_profileでsource .bashrcを追加します。
Windowsにnvm-windowsをインストール
件のnvm-windowsです。
インストールはnvm-setup.zipをダウンロード、解凍してインストールするだけです。
公式githubを見ると、
This is not the same thing as nvm, which is a completely separate project for Mac/Linux only.
nvm-windowsはnvmとは同じものではありません。nvmはMac/Linuxオンリーの完全に違うプロジェクトです。
nvmをWindowsで使えるようにしたもの、とは書いてありません。
「同じコマンドで」という希望を叶えてくれるか検証
〇 指定バージョンのNode.jsをダウンロードする
nvm
$ nvm install 10.16.1
Downloading and installing node v10.16.1...
Downloading https://nodejs.org/dist/v10.16.1/node-v10.16.1-linux-x64.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v10.16.1 (npm v6.9.0)
Creating default alias: default -> 10.16.1 (-> v10.16.1)
nvm-windows
nvm install 10.16.1
Downloading node.js version 10.16.1 (64-bit)...
Complete
Creating C:\Users\naka\AppData\Roaming\nvm\temp
Downloading npm version 6.9.0... Complete
Installing npm v6.9.0...
Installation complete. If you want to use this version, type
nvm use 10.16.1
nvm install {インストールするNode.jsのバージョン}で統一出来ます。
〇 ローカルPCにインストールされているNode.js一覧を出す
nvm
$ nvm ls
-> v10.16.1
default -> 10.16.1 (-> v10.16.1)
node -> stable (-> v10.16.1) (default)
stable -> 10.16 (-> v10.16.1) (default)
iojs -> N/A (default)
unstable -> N/A (default)
lts/* -> lts/dubnium (-> v10.16.1)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.16.0 (-> N/A)
lts/dubnium -> v10.16.1
nvm-windows
nvm ls
* 10.16.1 (Currently using 64-bit executable)
10.16.0
10.15.3
8.11.1
見え方は違えども、npm lsで統一出来ます。
よしいいぞ・・・!
〇 指定バージョンのNode.jsに切り替える
nvm
$ nvm use 10.16.1
Now using node v10.16.1 (npm v6.9.0)
nvm-windows
nvm use 10.16.1
Now using node v10.16.1 (64-bit)
nvm use {使用するNode.jsのバージョン}で揃えられる!
表示される文言もほぼ変わらない。
あぁ・・・もうオプションの違いに悩まされなくて済むんだなぁ・・・・。
× ダウンロード出来るNode.jsのバージョンを教えてくれる
nvm
$ nvm ls-remote
v0.1.14
v0.1.15
(snip)
v12.6.0
v12.7.0
nvm-windows
nvm list available
| CURRENT | LTS | OLD STABLE | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
| 12.7.0 | 10.16.1 | 0.12.18 | 0.11.16 |
| 12.6.0 | 10.16.0 | 0.12.17 | 0.11.15 |
| 12.5.0 | 10.15.3 | 0.12.16 | 0.11.14 |
| 12.4.0 | 10.15.2 | 0.12.15 | 0.11.13 |
| 12.3.1 | 10.15.1 | 0.12.14 | 0.11.12 |
| 12.3.0 | 10.15.0 | 0.12.13 | 0.11.11 |
| 12.2.0 | 10.14.2 | 0.12.12 | 0.11.10 |
| 12.1.0 | 10.14.1 | 0.12.11 | 0.11.9 |
| 12.0.0 | 10.14.0 | 0.12.10 | 0.11.8 |
| 11.15.0 | 10.13.0 | 0.12.9 | 0.11.7 |
| 11.14.0 | 8.16.0 | 0.12.8 | 0.11.6 |
| 11.13.0 | 8.15.1 | 0.12.7 | 0.11.5 |
| 11.12.0 | 8.15.0 | 0.12.6 | 0.11.4 |
| 11.11.0 | 8.14.1 | 0.12.5 | 0.11.3 |
| 11.10.1 | 8.14.0 | 0.12.4 | 0.11.2 |
| 11.10.0 | 8.13.0 | 0.12.3 | 0.11.1 |
| 11.9.0 | 8.12.0 | 0.12.2 | 0.11.0 |
| 11.8.0 | 8.11.4 | 0.12.1 | 0.9.12 |
| 11.7.0 | 8.11.3 | 0.12.0 | 0.9.11 |
| 11.6.0 | 8.11.2 | 0.10.48 | 0.9.10 |
This is a partial list. For a complete list, visit https://nodejs.org/download/release
・・・なぜだ、なぜ「nvm ls-remote」で揃えず「nvm list available」にしたんだ・・・orz。
doskey nvm ls-remote=nvm list available
でエイリアス作れないかと思いましたが、スペースが空いてしまうのでコマンド置き換えではなくオプション追加的な意味合いになり、エラーになってしまいますね。
スペースを無くして繋げちゃえばエイリアスとして使えますが、本末転倒な気がします。
doskey nvm-ls-remote=nvm list available
・・・まぁ、nvm-windowsがnvmの純粋なクローンだとは公式でも言っていないですし、そこはオリジナルとして尊重すべきところなのかも。
まとめ
とはいったものの、nvm-windowsはとても快調でNodistから移行して2年程困ったことがありません。一回だけ以下のエラーにハマったくらいです。
逆にnvmの方はサーバ側の負荷が高いのか、ls-remoteやinstallの時間がかなり掛かります。その点nvm-windowsはずっと快適に動いてくれています。
もしnvm-windowsがnvmと同じだったら同じく遅くなっていたかも・・・と考えるとls-remoteとlist availableの違いくらい余裕で目が瞑れます。
- Windows : nvm-windows
- Mac、Linux:nvm
好みはあるでしょうが、私は取りあえずこれで不自由は有りません。