Wie kann ich die erforderliche Node.js-Version in package.json angeben?

261

Ich habe ein Node.js-Projekt, für das Node Version 12 oder höher erforderlich ist. Gibt es eine Möglichkeit, dies in der Datei packages.json anzugeben, damit das Installationsprogramm die Benutzer automatisch überprüft und informiert, wenn sie ein Upgrade benötigen?

Erel Segal-Halevi
quelle
1
Ein ähnlicher Weg wie Adams Antwort, auch unter Verwendung von node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka
Hier wurde bereits die Frage gestellt: Wie erzwinge ich die Verwendung einer bestimmten node.js-Version?
Cilap
Ich frage mich, ob es ein Tool gibt, das dieses Feld automatisch auf einen geeigneten Wert setzen kann, indem es die API-Verwendung überprüft.
Geekley

Antworten:

287

Ich denke, Sie können das Feld "Motoren" verwenden:

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

Da Sie sagen, dass Ihr Code mit niedrigeren Versionen definitiv nicht funktioniert, möchten Sie wahrscheinlich auch das Flag "engineStrict":

{ "engineStrict" : true }

Die Dokumentation zur Datei package.json finden Sie auf der Website npmjs

Aktualisieren

engineStrictist jetzt veraltet, daher wird nur eine Warnung ausgegeben. Jetzt muss der Benutzer ausführen, npm config set engine-strict truewenn er dies möchte.

Update 2

Wie unten erwähnt, wird beim Erstellen einer .npmrcDatei im Stammverzeichnis Ihres Projekts (auf derselben Ebene wie Ihre Datei package.json) mit dem Text engine-strict=trueein Fehler während der Installation erzwungen, wenn die Knotenversion nicht kompatibel ist.

IBam
quelle
13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "Die selten verwendete Option package.json engineStrictist seit mehreren Monaten veraltet und erzeugt Warnungen, wenn sie verwendet wurde. Beginnend mit npm @ 3, dem Wert von Das Feld wird ignoriert, und Verstöße gegen die Engine führen nur zu Warnungen. Wenn Sie als Benutzer eine strikte Durchsetzung des Engines-Felds wünschen, führen Sie einfach npm config set engine-strict true aus. "
Mike Stead
1
Denken Sie daran, cd .. && npm i <folder-name>um nach dem Projekt selbst zu suchen. Dies wird jedoch einen ganzen Build in sich selbst auslösen.
mlunoe
6
Warum um alles in der Welt haben sie das abgelehnt
?
15
Das Hinzufügen engine-strict=truezu Ihrer .npmrc hat jetzt den gleichen Effekt
ben
4
@ben Perfekt, danke! Dies kann so festgelegt werden, dass mindestens Ihr gesamtes Team die Anforderungen an die Motorversion erfüllen muss.
Joshua Pinter
115

Hinzufügen

zu package.json

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

in die Datei .npmrc(in der Nähe des package.jsongleichen Verzeichnisses)

engine-strict=true
Mikel
quelle
3
Dies ist die einfachste Lösung, die dem Endbenutzer einen netten fetten Fehler macht, wenn er beim Ausführen nicht die richtige Version des Knotens hat npm install. arbeitet mit yarnals auch
jcollum
Dies scheint überhaupt keine Wirkung zu haben. Ich habe meine package.jsonmit einem "Engines" -Abschnitt ähnlich dem oben ( 11.13.0und 6.7.0) und einem .npmrcmit nichts als dem oben angegebenen Inhalt eingerichtet. Ich hatte nvm mich auf eine ältere Knotenversion umstellen lassen und dann ausgeführt npm install, aber es installiert nur die Abhängigkeiten und erwähnt nicht einmal die Nichtübereinstimmung der Engine-Version.
Adrian
54

Genau wie gesagt, Ibam engineStrictist jetzt veraltet. Aber ich habe diese Lösung gefunden:

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"
  }
}

Weitere Informationen finden Sie hier: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

Und noch etwas. Eine Punktdatei '.nvmrc' kann verwendet werden, um eine bestimmte Knotenversion zu erfordern - https://github.com/creationix/nvm#nvmrc

Es wird jedoch nur von npm-Skripten (und Garnskripten) respektiert.

Adam
quelle
2
Dies ist die beste Antwort im Jahr 2019 angesichts der veralteten Motorabwertung und der Tatsache, dass viele (wahrscheinlich) auf diese stoßen, weil Versionen mit nvm gewechselt werden.
Handwerk
14

.nvmrc

Wenn Sie NVM wie dieses verwenden , was Sie wahrscheinlich sollten, können Sie die für ein bestimmtes Projekt erforderliche nodejs-Version in einer git-tracked- .nvmrcDatei angeben :

echo v10.15.1 > .nvmrc

Dies wird nicht automatisch wirksam cd, was vernünftig ist: Der Benutzer muss dann Folgendes ausführen:

nvm use

und jetzt wird diese Version des Knotens für die aktuelle Shell verwendet.

Sie können die Versionen des Knotens auflisten, mit denen Sie arbeiten:

nvm list

.nvmrcist dokumentiert unter: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

Es cdwurde gefragt , wie diese Knotenversion automatisch ausgewählt werden soll : Automatisch auf die richtige Version des Knotens basierend auf dem Projekt wechseln

Getestet mit NVM 0.33.11.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
8

Es gibt einen anderen, einfacheren Weg, dies zu tun:

  1. npm install Node@8 (speichert Knoten 8 als Abhängigkeit in package.json)
  2. Ihre App wird mit Node 8 für jeden ausgeführt - auch für Garnbenutzer!

Dies funktioniert, da nodees sich nur um ein Paket handelt, das den Knoten als Paket-Binärdatei ausliefert. Es enthält nur node_module / .bin, was bedeutet, dass der Knoten nur für Paketskripte verfügbar ist. Nicht Hauptschale.

Siehe Diskussion auf Twitter hier: https://twitter.com/housecor/status/962347301456015360

vnglst
quelle
5
Ich bin anderer Meinung, dies würde möglicherweise das Problem verbergen und eine andere Version des Knotens von der Seite laden, wenn er nicht installiert wäre.
Brendan Hannemann
7
-1 weil dies eine schreckliche (wirklich schreckliche) Idee ist. Wenn Sie arbeitslos sind, sollten Sie zuerst ein Unternehmen finanzieren und dort anfangen zu arbeiten.
Ozanmuyes
2
Klingt für mich nach einer großartigen Idee. Separate Knotenversionen für separate Projekte. Kann sicher ein Upgrade durchführen, ohne die anderen zu aktualisieren. Nur catch muss in .bin laufen ./node node-sassund nicht nur node-sass. Ich bin mir nicht sicher, ob dies für alle .bin-Dateien gleich ist.
Jon
2
Dies ist eine einfache und elegante Lösung. Solange die Teammitglieder, die an dem Produkt arbeiten, wissen, dass dies geschieht, halte ich es für eine großartige Antwort. Wir verwenden diese Technik in einem großen Unternehmen, um die Vielfalt der Node-Versionen für ein Dutzend Web-Front-End-Produkte zu verarbeiten. Beseitigt die Notwendigkeit eines ständigen Wechsels mit nvm beim Hin- und Herwechseln zwischen Produkten.
Nathan Bedford
2
Diese Lösung hat ihre eigenen Vor- und Nachteile. Die Kapselung der Knotenversion ist möglicherweise der größte Vorteil. Der Nachteil ist die aufgeblähte Docker-Image-Größe, wenn Sie sie auf diese Weise bereitstellen.
ivosh
0

Ein Mokka-Testfallbeispiel:

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);
    });});
Jamie Nicholl-Shelley
quelle
1
Sollte kein Unit-Test sein, verwenden Sie package.json / dotfiles
bgcode
2
Aber whhhhhhhy, ein Unit-Test ist dafür ausgelegt> -
Jamie Nicholl-Shelley
Weil Sie Node benötigen, um einen Unit-Test durchzuführen. Wenn die vorhandene Knotenversion zu veraltet ist, werden die Tests einfach nicht ausgeführt oder sie schlagen mit Syntaxfehlern oder SMTH fehl. ähnlich, was den Punkt des Unit-Tests zunichte macht. Es ist, als würde man ein Formular zum Zurücksetzen des Passworts hinter einem Autorisierungsformular verstecken. Wenn Sie sich nicht an das Kennwort erinnern können, müssen Sie die Funktion zum Zurücksetzen des Kennworts verwenden. Jetzt können Sie sie jedoch nicht mehr verwenden, da Sie sich nicht an das Kennwort erinnern.
Ankhzet