Comment puis-je spécifier la version Node.js requise dans package.json?

261

J'ai un projet Node.js qui nécessite Node version 12 ou supérieure. Existe-t-il un moyen de le spécifier dans le fichier packages.json, afin que le programme d'installation vérifie automatiquement et informe les utilisateurs s'ils ont besoin de mettre à niveau?

Erel Segal-Halevi
la source
1
Une manière similaire à la réponse d'Adam, en utilisant également node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka
Une question a déjà été posée ici: comment appliquer une version spécifique de node.js à utiliser?
cilap
Je me demande s'il existe un outil qui peut automatiquement définir ce champ à une valeur appropriée en inspectant l'utilisation de l'API.
geekley du

Réponses:

288

Je pense que vous pouvez utiliser le champ "moteurs":

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

Comme vous dites que votre code ne fonctionnera certainement pas avec les versions inférieures, vous voulez probablement le drapeau "engineStrict" aussi:

{ "engineStrict" : true }

La documentation du fichier package.json est disponible sur le site npmjs

Mettre à jour

engineStrictest maintenant obsolète, donc cela ne donnera qu'un avertissement. Il appartient désormais à l'utilisateur de s'exécuter npm config set engine-strict trues'il le souhaite.

Update 2

Comme ben l'a souligné ci-dessous, la création d'un .npmrcfichier à la racine de votre projet (au même niveau que votre fichier package.json) avec le texte engine-strict=trueforcera une erreur lors de l'installation si la version Node n'est pas compatible.

IBam
la source
13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "L'option package.json rarement utilisée engineStrictest obsolète depuis plusieurs mois, produisant des avertissements lors de son utilisation. À partir de npm @ 3, la valeur de champ est ignoré et les violations de moteur ne produiront que des avertissements. Si vous, en tant qu'utilisateur, souhaitez une application stricte des moteurs, exécutez simplement npm config set engine-strict true "
Mike Stead
1
N'oubliez pas cd .. && npm i <folder-name>de vérifier le projet lui-même. Cependant, cela déclenchera une construction entière en elle-même.
mlunoe
6
pourquoi
diable
15
Ajouter engine-strict=trueà votre .npmrc a maintenant le même effet
ben
4
@ben Parfait, merci! Et cela peut être engagé afin qu'au moins toute votre équipe soit tenue de respecter les exigences de version du moteur.
Joshua Pinter
115

Ajouter

à package.json

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

vers le fichier .npmrc(proche package.json, même répertoire)

engine-strict=true
Mikel
la source
3
C'est la solution la plus simple qui donne à l'utilisateur final une grosse erreur de ne pas avoir la bonne version du nœud lors de son exécution npm install; fonctionne yarnaussi avec
jcollum
1
Cela semble n'avoir aucun effet. J'ai créé mon package.jsonavec une section "moteurs" similaire à celle ci-dessus ( 11.13.0et 6.7.0), et une .npmrcavec rien d'autre que le contenu spécifié ci-dessus. J'ai eu nvm me faire basculer sur une version de nœud plus ancienne, puis j'ai couru npm install, mais il installe simplement les dépendances et ne mentionne même pas le décalage de version du moteur.
Adrian
54

Tout comme dit Ibam, il engineStrictest désormais obsolète. Mais j'ai trouvé cette solution:

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

En savoir plus ici: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

Et encore une chose. Un fichier dot '.nvmrc' peut être utilisé pour exiger une version de nœud spécifique - https://github.com/creationix/nvm#nvmrc

Mais, il n'est respecté que par les scripts npm (et les scripts de fil).

Adam
la source
2
C'est la meilleure réponse en 2019, à la lumière de la dépréciation du moteur et du fait que beaucoup sont (probablement) confrontés à cela en raison du changement de version avec nvm.
fabriquer le
14

.nvmrc

Si vous utilisez NVM comme celui-ci , ce que vous devriez probablement faire, vous pouvez indiquer la version nodejs requise pour le projet donné dans un .nvmrcfichier git-tracké :

echo v10.15.1 > .nvmrc

Cela ne prend pas effet automatiquement sur cd, ce qui est sensé: l'utilisateur doit alors faire:

nvm use

et maintenant cette version du nœud sera utilisée pour le shell actuel.

Vous pouvez répertorier les versions de nœud que vous avez avec:

nvm list

.nvmrcest documenté à: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

La façon de sélectionner automatiquement la version de ce nœud sur a cdété posée à: Passer automatiquement à la version correcte du nœud en fonction du projet

Testé avec NVM 0.33.11.

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

Il existe un autre moyen plus simple de procéder:

  1. npm install Node@8 (enregistre le nœud 8 en tant que dépendance dans package.json)
  2. Votre application fonctionnera en utilisant Node 8 pour tout le monde - même les utilisateurs de Yarn!

Cela fonctionne parce que node s'agit simplement d'un package qui expédie le nœud en tant que package binaire. Il inclut juste comme node_module / .bin ce qui signifie qu'il ne rend le nœud disponible que pour les packages de scripts. Pas la coque principale.

Voir la discussion sur Twitter ici: https://twitter.com/housecor/status/962347301456015360

vnglst
la source
5
Je ne suis pas d'accord, cela pourrait potentiellement masquer le problème et charger une version différente du nœud si elle n'était pas installée.
Brendan Hannemann
7
-1 parce que c'est une idée terrible (vraiment terrible). C'est comme dire que si vous êtes au chômage, vous devez d'abord financer une entreprise et vous pouvez commencer à y travailler.
ozanmuyes
2
CA semble être une bonne idée. Versions de noeud distinctes pour des projets distincts. Peut mettre à niveau en toute sécurité l'un sans mettre à niveau les autres. Seul catch doit être exécuté en .bin ./node node-sassplutôt que juste node-sass. Je ne sais pas si c'est la même chose pour tous les fichiers .bin.
Jon
2
Il s'agit d'une solution simple et élégante - tant que les membres de l'équipe travaillant sur le produit savent que cela se produit, je pense que c'est une excellente réponse. Nous utilisons cette technique dans une grande entreprise pour gérer la variété des versions de nœuds pour une douzaine de produits frontaux Web. Supprime la nécessité d'une commutation constante avec nvm lors des allers-retours entre les produits.
Nathan Bedford
2
Cette solution a ses avantages et ses inconvénients. L'encapsulation de version de nœud est potentiellement son plus grand pro. L'inconvénient est la taille de l'image docker gonflée si vous allez la déployer de cette façon.
ivosh
0

Un exemple de cas de test 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);
    });});
Jamie Nicholl-Shelley
la source
1
Ne devrait pas être un test unitaire, utilisez package.json / dotfiles
bgcode
2
Mais whhhhhhhy, un test unitaire est conçu pour cela> .-
Jamie Nicholl-Shelley
Parce que vous avez besoin de Node pour exécuter un test unitaire. Si la version du nœud présente est trop obsolète, les tests ne fonctionneront tout simplement pas ou ils échoueront avec une erreur de syntaxe ou smth. similaire, ce qui bat le point de test unitaire. C'est comme cacher un formulaire de réinitialisation de mot de passe derrière un formulaire d'autorisation. Si vous ne vous souvenez pas du mot de passe, vous devez utiliser la fonction de réinitialisation du mot de passe, mais maintenant vous ne pouvez pas l'utiliser, car vous ne vous souvenez pas du mot de passe.
ankhzet