l12a

白ウサギを追え

node.js と npm のバージョン固定をする

複数のプロジェクトに携わっていると、プロジェクトにより使用すべき node.js / npm のバージョンが違うことがあります。
誤ったバージョンの node.js / npm を使っているとインストールやビルドに失敗することもあるので node.js / npm のバージョンを固定していきます。

現在のバージョンを確認する

作業開始前の node.js / npm のバージョンはそれぞれ以下の通りです。

$ node -v
v14.0.0
$ npm -v
6.14.4

プロジェクト作成

ディレクトリを作成して移動し、プロジェクトを初期化します。 便宜上、npm init 後の対話インターフェースは -y で飛ばします。

$ mkdir myApp && cd $_
$ npm init -y

一度 npm install をしてみます。
お試しなので、依存パッケージを追加する必要はありません。

$ npm install
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN hoge@1.0.0 No description
npm WARN hoge@1.0.0 No repository field.

up to date in 0.342s
found 0 vulnerabilities

package-lock.json が生成されて、コマンドが終了しました。

バージョン固定のための準備と確認

node.js / npm のバージョン固定をするために package.json を編集し、engines ブロックを追加します。 以下を書き加えて保存してください(固定したいバージョンを書きます)

"engines": {
  "node": "14.0.0",
  "npm": "6.14.4"
}

挙動を確認するため、node.js / npm を任意のバージョンに変更します。 手元に入っていた以下のバージョンに変えました。

$ node -v
v10.17.0
$ npm -v
6.11.3

エラーを表示できることを確認するために npm install します。
engines の指定に忠実にするためには --engine-strict オプションが必要です。

$ npm install --engine-strict
npm ERR! code ENOTSUP
npm ERR! notsup Unsupported engine for myapp@1.0.0: wanted: {"node":"14.0.0","npm":"6.14.4"} (current: {"node":"10.17.0","npm":"6.11.3"})
npm ERR! notsup Not compatible with your version of node/npm: myapp@1.0.0
npm ERR! notsup Not compatible with your version of node/npm: myapp@1.0.0
npm ERR! notsup Required: {"node":"14.0.0","npm":"6.14.4"}
npm ERR! notsup Actual:   {"npm":"6.11.3","node":"10.17.0"}

エラーが表示されました。

設定ファイルを使ったオプションの省略

--engine-strict オプションがないと、何事もなくコマンドが完了するので、つけ忘れてしまうかもしれません。 設定ファイルを追加することでこのオプションを省略することもできます。

.npmrc を作成し以下を記載してください。

engine-strict=true

これで --engine-strict オプションを指定しなくてもエラー表示できるようになりました。

nodenv などを利用した自動切り替えについて

nodenv などを使えばプロジェクトディレクトリに移動した時に自動的にnode.js のバージョンを切り替えるような動作も可能で、
これは大変便利である一方でツールへの依存が増えることにもなります。

個人の環境にこれを使うことは自由に行えば良いと思いますが、チーム内でのルールとしてはできるだけ基本的なツールに限定しておくのが良いでしょう。