サーバーサイドローカル環境

【Node.js】 Windowsで複数のバージョンを管理する方法

更新日:2021/05/27

 

なぜ既存ツールを使用しないのか

Windowsに複数のバージョンのNode.jsをインストールして管理したい場合、nodistやnvm-windowsなどのツールを利用できます。

しかし、どのような仕組みでバージョン切り替えを行っているのか不明な点が多く、例えば他のツールとNode.jsを連携したいときなど、とても苦労することが予想されます。

だったら、自分で仕組みを作った方が応用が効くというものです。

やってみたら、あっさりとできました。

わざわざツールを入れるほどのものではないです。

 

バージョン管理の仕組みをつくる

では仕組みを作ってみます。

やっていることは、各バージョンをインストーラーを使用しないでフォルダに展開し、バッチファイルでパスを切り替えるだけです。

Windowsバイナリ―をダウンロード

まずは、Node.jsをダウンロードします。

LTS(推奨版)および最新版は、下のリンク先を開いてください。

Windows Binary (.zip)の32ビット版または64ビット版をクリックして、ダウンロードします。

けーちゃん

その他のバージョンは、次のリンクからダウンロードします。

リリース一覧(過去のNode.js)

各バージョンのリンク先がファイル一覧になっています。
この中から、node-vXX.XX.X-win-x64.zip または、node-vXX.XX.X-win-x86.zip をクリックして、ダウンロードします。
なお、XX.XX.Xはバージョン名、x64は64ビット版、x86は32ビット版です。

フォルダに解凍

ダウンロードしたzipファイル毎にフォルダを作成し、その中にzipファイルを展開します。

場所は自分の好みで問題ありません。

今回は、C:\Program Filesにnodeという名前のフォルダを作成して、その中に各バージョンのフォルダを作成しました。


C:\Program Files\node
v14_17_0node-v14.17.0-win-x64.zip を解凍
v16_2_0node-v16.2.0-win-x64.zip を解凍

バージョンの区切りが _ になっていますが、 . (ドット)でも大丈夫です。たぶん。
僕はMSDOSのころからパソコンを使用してきているためか、windowsで. (ドット)が複数並ぶと奇妙に感じてしまうのです。Linuxとかは別に抵抗がないのですが…

グローバルインストールパスの調整

インストーラーを使用使用してNode.jsをインストールした場合、npmのグローバルインストール先として 環境変数APPDATA\npm がセットされます。
(通常環境変数APPDATAは、c:\Users\ユーザー名\AppData\Roaming\)
この設定により、Windowsアカウント毎にグローバルインストール先を切り替えるようになっています。

しかしzipを展開してインストールした場合は、展開したフォルダ\node_modules となります。これは、全てのWindowsアカウントで同じフォルダを使用します。

インストーラーと同じように、Windowsアカウント毎にグローバルインストール先を切り替えたいときは、次のような手順をおこないます。

  1. 展開したフォルダ内のnode_modules\npmにnpmrcという名前のファイルを作成する

    ( .npmrc というファイルがあるので、間違えないように注意)

  2. npmrcに、prefix=${APPDATA}\npm\バージョン名 を入力して保存する

prefix=${APPDATA}\npm\v14_17_0

バッチファイルの作成

次は、各バージョンの設定をおこないコマンドプロンプトを起動するバッチファイルを作成します。

今回は次のように構成で、v14_17_0のNode.jsに切り替える node14_17_0.bat と、v16_2_0のNode.jsに切り替える node16_2_0.bat を作成してみます。


C:\Program Files\node
     ┣ v14_17_0 <フォルダ>
     ┣ v16_2_0 <フォルダ>
     ┣ node14_17_0.bat
     ┗ node16_2_0.bat

node14_17_0.bat

@echo off
set PATH=C:\Program Files\node\v14_17_0;%PATH%;
node -v
cmd /k

node16_2_0.bat

@echo off
set PATH=C:\Program Files\node\v16_2_0;%PATH%;
node -v
cmd /k

@echo off は、以降のコマンドで出力されるメッセージを抑制し、実行結果のみ表示します。

2行目は、元からある環境変数PATHの前に、Node.jsへのパスを追加しています。
グローバルインストールしたパッケージをCLIで実行する必要があるときは、グローバルインストール先のパスも%PATH%の前に追加しておきます。
ここで追加したPATHは、このコマンドプロンプト内でのみ有効です。

3行目は、Node.jsのバージョンを出力しています。

4行目は、cmd /k でコマンドプロンプトを起動したままバッチを終了しています。

重要なのは、2行目と4行目です。
他は、削ってしまっても大丈夫です。

このバッチファイルのショートカットアイコンを作成して、デスクトップなどに貼り付けておくと簡単に各バージョンに対応したNode.jsを起動することができます。

ショートカットアイコンをダブルクリック

さらに今回は、Windowsの環境変数設定でC:\Program Files\nodeにパスを通しておきます。

環境変数の設定方法はこちらに記事を読んでみてください。
Windows10で環境変数を追加・変更する方法

こうしておくと、コマンドプロンプト上で各バッチファイルを実行できます。

コマンドプロンプト


C:\Users\aaa>node14_17_0 ← バッチの起動
v14.17.0          

C:\Users\aaa>node test.js  ← スクリプトの実行

グローバルインストールパスの設定

パッケージをグローバルインストールして使用する場合、環境変数NODE_PATHをバッチファイルに追加する必要があります。

まずは、グローバルインストールのパスを確認します。

これまで作成してきたバッチファイルで、コマンドプロンプトを起動したあと、npm root -g を実行します。

コマンドプロンプト


C:\Users\aaa>node14_17_0 ← バッチの起動
v14.17.0          

C:\Users\aaa>npm root -g
C:\Users\aaaa\AppData\Roaming\npm\v14_17_0\node_modules
             ↑ グローバルインストールのパス

バッチファイルに、環境変数NODE_PATHの設定を追加します。

node14_17_0.bat

@echo off
set PATH=%PATH%;C:\Program Files\node\v14_17_0;
set NODE_PATH=C:\Users\aaaa\AppData\Roaming\npm\v14_17_0\node_modules
node -v
cmd /k

3行目が、NODE_PATHの設定です。

バッチを書き換えたら、グローバルインストールパスが適用されているか確認します。

コマンドプロンプト


C:\Users\aaa>node14_17_0 ← バッチの起動
v14.17.0          

C:\Users\aaaa>node ← node.exeを実行
Welcome to Node.js v14.17.0.
Type ".help" for more information.
> module.paths ← 検索パスを表示
[
  'C:\\Users\\aaaa\\node_modules',
  'C:\\Users\\node_modules',
  'C:\\node_modules',
  'C:\\Users\\aaaa\\AppData\\Roaming\\npm\\v14_17_0\\node_modules', ←追加されている
  'C:\\Users\\aaaa\\.node_modules',
  'C:\\Users\\aaaa\\.node_libraries',
  'C:\\Program Files\\node\\node14_17_0\\lib\\node'
]
>

module.pathsに、グローバルインストールパスがあれば適用されています。

 

インストーラーでインストール済みの場合

既にインストーラーでNode.jsをインストールしてある場合は、バッチファイルを使用しないでNode.jsを起動すると、既存のバージョンが有効になります。

他のツールと連携しているときなどは、そのまま使用できます。

更新日:2021/05/27

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。