nodejs

Mac、Linux、Windows(WSL無し環境)でNode.jsバージョン切り替え方法を統一したい

投稿日:2019年8月7日

一時期ローカルPCにインストールされたNode.jsのバージョンを切り替えるツールが乱立してどれを選べばいいの状態で、当然オプションも違うのでOSによって違うツールが入っているとオプションを覚えるのがしんどい状況でした。

面倒臭がりとしては、どのOSでNode.jsのバージョンを切り替える時も、同じコマンドで切り替えたいのです。

因みにバージョン切り替えツールに望む個人的な要望は以下の4つです。これだけ叶えてくれれば文句はありません。

  1. 指定バージョンのNode.jsをダウンロード出来る
  2. ローカルPCにインストールされているNode.js一覧を出してくれる
  3. 指定バージョンのNode.jsに切り替えてくれる
  4. ダウンロード出来る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

好みはあるでしょうが、私は取りあえずこれで不自由は有りません。

-nodejs
-, ,

執筆者:

関連記事

mkcertとhttp-serverでHTTPS環境を作りAndroid(chrome)、iPhone(safari)から接続

簡単にパーフェクトなオレオレ証明書が作れるとgithub上で人気上昇中の「mkcert」。 GitHub  135 UsersFiloSottile/mkcerthttps://github …

podmanとNode.js公式コンテナイメージでnodeコマンドを使う

REHL8(CentOS8)からデフォルトインストールされるようになったpodmanでnodeコマンドが使える環境を作ってみます。 目次1 環境2 やること3 Node.jsイメージの導入4 コンテナ …

Angular4.4のHTTP通信処理にタイムアウトを設定をすると「timeout is not a function」エラーが発生する

目次1 事象2 原因3 対処4 まとめ 事象 Angular4.3で追加されたHttpClientModuleに移行せず、HttpModuleを使い続けているアプリで、とある理由からpackage-l …

Typescript3.0以下の環境で発生する「Cannot find name ‘unknown’」に対処する

目次1 事象2 原因3 対処4 まとめ 事象 Typescript2.3.4を使っている息の長いWebシステムでnpm installをし直し、tscビルドし直したらトランスパイルエラーが発生。「un …

http-serverコマンドでHTTPS、CORSサーバをたてる

「フロントエンドをHTTPS化してHTTP公開しているREST APIに接続したい、でも自分のPCにApacheやNginxを入れてHTTPS化するのは面倒くさい」 開発中ってこういうニーズと悩みが結 …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯現役技術者を目指しています。健康第一。