package.jsonにenginesを追加してNode.jsのバージョンを指定する
package.jsonに engines フィールドを追加して、使用するNode.jsのバージョンを指定することができます。
以下はその方法です。
1. プロジェクトのルートディレクトリにある package.json ファイルを開きます。
2. engines フィールドを追加し、指定したいNode.jsのバージョンを記述します。
例えば、Node.jsのバージョンを14.xに指定したい場合、package.jsonは次のようになります。
{ "name": "project-name", "version": "1.0.0", "description": "description", "main": "index.js", "scripts": { "start": "node index.js" }, "engines": { "node": "14.x" }, "dependencies": { // your dependencies } }
"node": "14.x" は、バージョン14のNode.jsを使用することを指定しています。
特定のバージョンを指定することもできますし、範囲を指定することもできます。
例えば、"node": ">=14.0.0 <15.0.0" のように指定することも可能です。
この状態でバージョン14とは別のバージョンでnpm installやyarn installコマンドを実行した場合、以下の結果になります。
npm install
npm WARN EBADENGINE Unsupported engine { npm WARN EBADENGINE package: 'project-name@1.0.0', npm WARN EBADENGINE required: { node: '14.x' }, npm WARN EBADENGINE current: { node: '12.x', npm: '6.14.8' } npm WARN EBADENGINE }
npmの場合は警告メッセージが出力されて、インストール自体は実行されます。
yarn install
error your-project-name@1.0.0: The engine "node" is incompatible with this module. Expected version "14.x". Got "12.x" error Found incompatible module.
yarnの場合はエラーメッセージが出力され、インストールは中止されます。
なのでyarnを使用する場合はenginesフィールドを追加すればバージョンは強制できますね。
npmでNode.jsのバージョンを強制する方法
npmでは、engine-strict オプションを使用すればNode.jsのバージョンを強制することができます。
このオプションを使用すれば、指定されたバージョン以外のNode.jsが使用されている場合、エラーが発生します。
このオプションを設定するには、プロジェクトのルートディレクトリに .npmrc ファイルを作成し、次の行を追加します。
engine-strict=true
この状態でバージョン14とは別のバージョンでnpm installコマンドを実行した場合、以下のようなエラーメッセージが出力されます。
npm ERR! code ENOTSUP npm ERR! notsup Unsupported engine for your-project-name@1.0.0: wanted: {"node":"14.x"} (current: {"node":"12.x","npm":"6.14.8"}) npm ERR! notsup Not compatible with your version of node/npm: your-project-name@1.0.0 npm ERR! notsup Not compatible with your version of node/npm: your-project-name@1.0.0 npm ERR! notsup Required: {"node":"14.x"} npm ERR! notsup Actual: {"npm":"6.14.8","node":"12.x"} npm ERR! A complete log of this run can be found in: npm ERR! /path/to/npm/logs/npm-debug.log
このようにpackage.jsonの設定等だけで、簡単にNode.jsのバージョンを強制できるのは楽ですね。