0
0

More than 3 years have passed since last update.

複数バージョンのNode.jsをPowershellスクリプトでインストール&切り替え

Posted at

はじめに

Node.jsではモジュールをインストールすると小さなファイルがたくさんできるので、HDDだと動作が重く感じることがある。そこでNode.jsごとSSDにインストールし直したところ大分快適になった。

今回の再設定では、複数バージョンのNode.jsをPower Shellのスクリプトを使ってインストール(というよりダウンロード)した。というのも、複数バージョンのNode.jsのインストール・切り替えを行う便利なツールはあるものの、Windows非対応だったりMinGWが必要だったり、良く分からないExeファイルが必要だったりするため、職場の事情で使わせてもらえないかもしれないためだ。

Powershellスクリプトを使ったインストール

nodeswitch というスクリプトを作成した。中身はリンク先を見てもらうとわかるようにとても単純で、Invoke-Webrequestを使ってNode.jsのディストリビューションをダウンロードしたり、Add-Itemでシンボリックリンクを作っているだけなので、拡張するのは難しくないと思う。
スクリプト自体はPowershellだが、起動は以下のようにバッチファイルから行う。(Powershellはバッチファイルのように起動できないため)

  • install-node <Version>: 指定したバージョンのZipファイルをダウンロード・解凍する
  • switch-node <Version>: 指定したバージョンにパスが通るようにする

例えば、バージョン14.1.0をインストールしたければ install-node 14.1.0 を実行する。これにより、64bit OSでは以下のようにversions以下にzipファイルが展開される。

[git clone で作られたフォルダ]
|
+- script
|  +- install-node.bat : インストール用のバッチファイル(中で common.ps1 をコール)
|  +- switch-node.bat  : バージョン切り替え用のバッチファイル(中で common.ps1 をコール)
|  +- common.ps1
|
+- common
|  +- node      : ディストリビューションごとのフォルダへのシンボリックリンク。PATH環境変数に追加すること。
|  +- npm_global: (同上) ここに、グローバルインストールしたモジュールが格納される。
|
+- versions
   +- node-v14.1.0-win-x64
   |  +- npm_global
   |
   +- node-v12.16.2-win-x64
      +- npm_global

npmの設定

Node.jsのパッケージマネージャ npm はデフォルト設定のままではうまく動かなかったり、AppDataにモジュールをインストールしたりしてしまうので、使う前にいくつか設定をしておく。

プロキシの設定

PCがプロキシサーバの内側にある場合は、npmでプロキシサーバの指定をする。職場では大抵この設定があると思うので、npmがうまく動かない場合は「インターネットのオプション」の「プロキシサーバ」の設定を確認し以下のコマンドでプロキシサーバを指定する。
image.png image.png

プロキシの設定
npm config set proxy http://your.proxy.server:8080
npm config set https-proxy http://your.proxy.server:8080

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

npm はデフォルト設定のままではグローバルインストール先がAppDataフォルダになっている。これをSSDに変更すると、Angularのようにファイルが多いモジュールが快適に使えるようになる。この設定はインストール用のスクリプトinstall-node内で実施しているので、追加で実施する必要はない。

グローバルインストールの変更
npm config set prefix <グローバルインストール先>

キャッシュの設定

必須ではないが、npmのモジュールのキャッシュをSSDに置くと速くなるかもしれない。(初回は同じくらい)

キャッシュの設定
npm config set cache <キャッシュファイルを置く場所>

node-gypの設定

npm のモジュールの中には、sqlite3のようにnode-gypを使ったビルドが必要なものがある。node-gypの動作にはPythonとVisual Studio Build Toolsのインストールと、npm configの設定が必要である。Chocolateyであれば自動でやってくれるのだが、ここではnode-gyp - On Windowsの手順に従い、手動でインストール・設定する。実はそんなに難しくない。

Visual Studio Build Toolsのインストールと設定

node-gyp - On Windows 「Option 2」のリンクから、Visual Studio Build Toolsのインストーラをダウンロードする。(この時はvs_buildtools__1947476439.1586275928.exeというファイルだった)

インストーラを開いたら「Visual C++ build tools」を選択し、インストール対象のコンポーネントにある「Visual Studio Build Tools 2019」をインストールする。インストール後に再度インストーラを起動すると、「インストール済み」と表示される。
image.png

Visual Studio Build Toolsをインストールしたら、以下のコマンドでnode-gypからどのビルドツールを使うかを指定する。(2019はインストールしたバージョンに読み替える)

VisualStudioBuildToolsの指定
npm config set msvs_version 2019

Pythonのインストールと設定

node-gyp はPython 2.7系と3.8系どちらにも対応しているが、ここでは3.8をインストールする。インストールしたら、以下のコマンドでnode-gypからどのPythonを使うかを指定する(パスは適宜読み替える)。

Pythonの指定
npm config set Python K:\python\python38\python.exe

ビルドできるか試してみる

これらの設定ができたら、ビルドが必要なモジュール(例えばsqlite3)をインストールできるようになる。

ビルドできることの確認
K:\test>npm install sqlite3
> sqlite3@4.1.1 install K:\test\node_modules\sqlite3
> node-pre-gyp install --fallback-to-build

node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v4.1.1/node-v83-win32-x64.tar.gz
node-pre-gyp WARN Pre-built binaries not found for sqlite3@4.1.1 and node@14.0.0 (node-v83 ABI, unknown) (falling back to source compile with node-gyp)
このソリューション内のプロジェクトを一度に 1 つずつビルドします。並行ビルドを有効にするには、"-m" スイッチを追加してください。
  unpack_sqlite_dep
  sqlite3.c
  win_delay_load_hook.cc
  ...以降ビルドの経過が表示される...
+ sqlite3@4.1.1
added 112 packages from 101 contributors and audited 162 packages in 45.258s

1 package is looking for funding
  run `npm fund` for details

found 0 vulnerabilities

おわりに

以上でNode.jsがとりあえず動く+ Sqlite3のようなネイティブのモジュールをインストールできるようになった。環境構築は地味だが、管理しないとバージョンアップで互換性がなくなったり、メンバ間のバージョン違いで不可解なトラブルが起きたりするので、インストーラに頼りすぎず、自前で環境構築用のスクリプトを作っておくのも良いかと思う。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0