必要なNode.jsバージョンをpackage.jsonで指定するにはどうすればよいですか?


261

Nodeバージョン12以降を必要とするNode.jsプロジェクトがあります。これをpackages.jsonファイルで指定して、アップグレードが必要かどうかをインストーラが自動的に確認してユーザーに通知する方法はありますか?


1
Adamの応答と同様の方法で、node.versionも使用:stackoverflow.com/a/48691987/3032209
Yair Kukielka


質問はすでにここで尋ねられました:特定のnode.jsバージョンを使用するように強制する方法は?
cilap

APIの使用状況を調べて、このフィールドを自動的に適切な値に設定できるツールがあるのでしょうか。
geekley

回答:


288

「engines」フィールドを使用できると思います。

{ "engines" : { "node" : ">=0.12" } }

あなたのコードはそれより低いバージョンでは絶対に機能しないと言っているので、おそらく "engineStrict"フラグも必要です:

{ "engineStrict" : true }

package.jsonファイルのドキュメントはnpmjsサイトにあります

更新

engineStrictは非推奨となったため、警告のみが表示されます。これがnpm config set engine-strict true必要な場合、実行するのはユーザーの責任です。

アップデート2

以下で指摘するように、ノードのバージョンに互換性がない場合、.npmrcプロジェクトのルートにファイル(package.jsonファイルと同じレベル)をテキストで作成engine-strict=trueすると、インストール中にエラーが発生します。


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "めったに使用されないpackage.jsonオプションengineStrictは 、数か月非推奨になり、使用時に警告が生成さました。npm @ 3以降、フィールドは無視され、エンジン違反は警告のみを生成します。ユーザーとして、厳密なエンジンフィールドの適用が必要な場合は、npm config set engine-strict trueを実行してください "
Mike Stead

1
cd .. && npm i <folder-name>プロジェクト自体を確認するために忘れないでください。ただし、これにより、ビルド全体がトリガーされます。
mlunoe


15
engine-strict=true.npmrcに追加しても同じ効果があります
ben

4
@benパーフェクト、ありがとう!そしてこれは、少なくともチーム全体がエンジンバージョンの要件に準拠する必要があるようにコミットすることができます。
Joshua Pinter

115

追加

package.json

  "engines": {
    "node": ">=10.0.0",
    "npm": ">=6.0.0"
  },

ファイルに.npmrcpackage.json同じディレクトリに近い)

engine-strict=true

3
これは、エンドユーザーが実行したときに適切なバージョンのノードが存在しないという重大なエラーをエンドユーザーに与える最も簡単な解決策npm installです。yarn同様に動作します
jcollum

1
これはまったく効果がないようです。私package.jsonは、上記(11.13.0および6.7.0)と同様の「engines」セクションと、上記で.npmrc指定されたコンテンツのみを持つa をセットアップしました。nvmで古いノードバージョンに切り替えてから実行npm installしましたが、依存関係がインストールされるだけで、エンジンバージョンの不一致についても言及されていません。
エイドリアン

54

イバムengineStrictが言ったように、現在非推奨です。しかし、私はこの解決策を見つけました:

check-version.js:

import semver from 'semver';
import { engines } from './package';

const version = engines.node;
if (!semver.satisfies(process.version, version)) {
  console.log(`Required node version ${version} not satisfied with current version ${process.version}.`);
  process.exit(1);
}

package.json:

{
  "name": "my package",
  "engines": {
    "node": ">=50.9" // intentionally so big version number
  },
  "scripts": {
    "requirements-check": "babel-node check-version.js",
    "postinstall": "npm run requirements-check"
  }
}

詳細はこちら:https : //medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

後もう一つ。dotfile '.nvmrc'は、特定のノードバージョンを要求するために使用できます-https ://github.com/creationix/nvm#nvmrc

しかし、それはnpmスクリプト(および糸スクリプト)によってのみ尊重されます。


2
これは2019年の最良の回答です。セットエンジンの廃止と、nvmでバージョンを切り替えることにより多くの人が(おそらく)これに遭遇しているという現実に照らします。
クラフト

14

.nvmrc

このようにNVMを使用している場合は(おそらくそうする必要がある)、git追跡.nvmrcファイルで特定のプロジェクトに必要なnodejsバージョンを指定できます。

echo v10.15.1 > .nvmrc

これはで自動的に有効になりませんcd。これはまともなことです。ユーザーは次のことを行う必要があります。

nvm use

そして、そのバージョンのノードが現在のシェルに使用されます。

あなたが持っているノードのバージョンをリストすることができます:

nvm list

.nvmrchttps://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrcに文書化されています

そのノードのバージョンを自動的に選択する方法cdは質問されました:プロジェクトに基づいてノードの正しいバージョンに自動的に切り替える

NVM 0.33.11でテスト済み。


8

これを行う別の簡単な方法があります。

  1. npm install Node@8 (Node 8をpackage.jsonの依存関係として保存します)
  2. アプリはNode 8を使用してでも(Yarnユーザーでも)実行できます。

これnodeは、nodeをパッケージバイナリとして出荷するだけのパッケージであるため機能します。これは、node_module / .binとして含まれているだけです。つまり、パッケージスクリプトでノードを使用できるようにするだけです。メインシェルではありません。

こちらのTwitterでの議論を参照してください:https : //twitter.com/housecor/status/962347301456015360


5
私は同意しません、これは潜在的に問題を隠し、それがインストールされていない場合、異なるバージョンのノードをサイドロードします。
ブレンダンハネマン2018年

7
-1これはひどい(本当にひどい)アイデアだからです。それは、もしあなたが失業しているならば、あなたは最初に会社に資金を供給すべきであり、あなたがそこで働き始めることができると言っているようなものです。
ozanmuyes

2
私には素晴らしいアイデアのように思えます。個別のプロジェクトの個別のノードバージョン。他をアップグレードせずに、1つを安全にアップグレードできます。キャッチだけでは./node node-sassなく、.bin で実行する必要がありますnode-sass。すべての.binファイルで同じかどうかはわかりません。
Jon

2
これはシンプルでエレガントなソリューションです。製品に取り組んでいるチームメンバーがこれが発生していることを知っている限り、それは素晴らしい答えだと思います。私たちは、大企業でこの手法を使用して、ダースのWebフロントエンド製品のさまざまなNodeバージョンに対応しています。製品間を行き来する際に、nvmで常時切り替える必要がなくなります。
Nathan Bedford

2
このソリューションには、独自の長所と短所があります。ノードバージョンのカプセル化は潜在的に最大の利点です。この方法でデプロイする場合、欠点は、Dockerイメージのサイズが肥大化することです。
-ivosh

0

Mochaテストケースの例:

describe('Check version of node', function () {
    it('Should test version assert', async function () {

            var version = process.version;
            var check = parseFloat(version.substr(1,version.length)) > 12.0;
            console.log("version: "+version);
            console.log("check: " +check);         
            assert.equal(check, true);
    });});

1
単体テストではないはずです。package.json/ dotfilesを使用してください
bgcode

2
しかし、hhhhhhhhhy、ユニットテストはこのために設計されています> .-
Jamie Nicholl-Shelley

ユニットテストを実行するにはNodeが必要だからです。存在するノードのバージョンが古すぎる場合、テストは単純に実行されないか、構文エラーまたはsmthで失敗します。単体テストのポイントを打ち負かします。これは、承認フォームの後ろにパスワードリセットフォームを隠すようなものです。パスワードを思い出せない場合は、パスワードのリセット機能を使用する必要がありますが、パスワードを覚えていないため、使用できなくなります。
アンクゼット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.