Come posso specificare la versione Node.js richiesta in package.json?


261

Ho un progetto Node.js che richiede Node versione 12 o successiva. C'è un modo per specificarlo nel file packages.json, in modo che il programma di installazione controllerà e informerà automaticamente gli utenti se devono aggiornare?


1
Un modo simile alla risposta di Adamo, utilizzando anche node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka


La domanda è già stata posta qui: come imporre una versione specifica node.js da utilizzare?
cilap,

Mi chiedo se esiste uno strumento che può impostare automaticamente questo campo su un valore appropriato controllando l'utilizzo dell'API.
Geekley,

Risposte:


288

Penso che tu possa usare il campo "motori":

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

Come stai dicendo che il tuo codice sicuramente non funzionerà con nessuna versione precedente, probabilmente vorrai anche il flag "engineStrict":

{ "engineStrict" : true }

La documentazione per il file package.json è disponibile sul sito npmjs

Aggiornare

engineStrictè ora deprecato, quindi verrà visualizzato solo un avviso. Ora spetta all'utente eseguire npm config set engine-strict truese lo desidera.

Aggiornamento 2

Come ben sottolineato di seguito, la creazione di un .npmrcfile nella radice del progetto (lo stesso livello del file package.json) con il testo engine-strict=trueforzerà un errore durante l'installazione se la versione del nodo non è compatibile.


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "L'opzione package.json utilizzata raramente engineStrictè stata deprecata per diversi mesi, producendo avvisi quando è stata utilizzata. A partire da npm @ 3, il valore del valore il campo viene ignorato e le violazioni del motore genereranno solo avvisi. Se tu, come utente, desideri un'applicazione rigorosa del campo dei motori, esegui semplicemente npm config set engine-strict true "
Mike Stead,

1
Ricordati di cd .. && npm i <folder-name>per verificare il progetto stesso. Tuttavia, questo attiverà un'intera build in se stesso.
mlunoe,

6
perché mai hanno deprecato che .. perde tutto il suo significato allora
vasilakisfil

15
L'aggiunta engine-strict=trueal tuo .npmrc ora ha lo stesso effetto
ben

4
@ben Perfetto, grazie! E questo può essere impegnato in modo che almeno l'intero team sia tenuto ad aderire ai requisiti della versione del motore.
Joshua Pinter,

115

Inserisci

per package.json

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

al file .npmrc(vicino a package.json, stessa directory)

engine-strict=true

3
Questa è la soluzione più semplice che offre all'utente finale un bel errore di non avere la versione corretta del nodo durante l'esecuzione npm install; funziona con yarncosì
jcollum

1
Questo sembra non avere alcun effetto. Ho impostato il mio package.jsoncon una sezione "motori" simile alla precedente ( 11.13.0e 6.7.0) e una .npmrccon nient'altro che i contenuti specificati sopra. Ho dovuto passare a una versione del nodo precedente, quindi npm installho eseguito , ma installa solo le dipendenze e non menziona nemmeno la mancata corrispondenza della versione del motore.
Adrian,

54

Proprio come ha detto Ibam, engineStrictora è deprecato. Ma ho trovato questa soluzione:

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

Scopri di più qui: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

E un'altra cosa. Un file dot '.nvmrc' può essere utilizzato per richiedere una specifica versione del nodo - https://github.com/creationix/nvm#nvmrc

Ma è rispettato solo dagli script npm (e dagli script di thread).


2
Questa è la migliore risposta nel 2019, alla luce della deprecazione del motore impostata e della realtà che molti (probabilmente) stanno incontrando questo a causa del passaggio di versioni con nvm.
artigianato

14

.nvmrc

Se stai usando NVM in questo modo , cosa che probabilmente dovresti, allora puoi indicare la versione di nodejs richiesta per un dato progetto in un file con traccia git .nvmrc:

echo v10.15.1 > .nvmrc

Questo non ha effetto automaticamente su cd, che è sano: l'utente deve quindi fare un:

nvm use

e ora quella versione del nodo verrà utilizzata per la shell corrente.

Puoi elencare le versioni del nodo che hai con:

nvm list

.nvmrcè documentato su: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

È cdstato chiesto come selezionare automaticamente la versione del nodo su : Passa automaticamente alla versione corretta del nodo in base al progetto

Testato con NVM 0.33.11.


8

C'è un altro modo più semplice per farlo:

  1. npm install Node@8 (salva il nodo 8 come dipendenza in package.json)
  2. La tua app verrà eseguita utilizzando il Nodo 8 per chiunque , anche per gli utenti di Yarn!

Questo funziona perché node è solo un pacchetto che spedisce il nodo come binario del pacchetto. Include solo come node_module / .bin che significa che rende disponibile il nodo solo per gli script del pacchetto. Shell principale.

Vedi la discussione su Twitter qui: https://twitter.com/housecor/status/962347301456015360


5
Non sono d'accordo, questo potenzialmente nasconderebbe il problema e sideload una versione diversa del nodo se non fosse installato.
Brendan Hannemann,

7
-1 perché questa è un'idea terribile (davvero terribile). È come dire che se sei disoccupato dovresti prima finanziare un'azienda e puoi iniziare a lavorare lì.
ozanmuyes,

2
Mi sembra un'ottima idea. Separare le versioni dei nodi per progetti separati. Puoi aggiornarne uno in sicurezza senza aggiornare gli altri. L'unica cattura deve essere eseguita in .bin ./node node-sassanziché solo node-sass. Non sono sicuro che sia lo stesso per tutti i file .bin.
Jon

2
Questa è una soluzione semplice ed elegante - fintanto che i membri del team che lavorano sul prodotto sanno che sta succedendo, penso che sia un'ottima risposta. Stiamo usando questa tecnica in una grande azienda per gestire la varietà di versioni di Node per una dozzina di prodotti Web front-end. Elimina la necessità di una commutazione costante con nvm quando si va avanti e indietro tra i prodotti.
Nathan Bedford,

2
Questa soluzione ha i suoi pro e contro. L'incapsulamento della versione del nodo è potenzialmente il suo più grande professionista. Il rovescio della medaglia è la dimensione dell'immagine della finestra mobile gonfiata se la si intende distribuire in questo modo.
Ivosh

0

Un esempio di test case 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
Non dovrebbe essere un test unitario, usa package.json /
dotfiles

2
Ma quando, un test unitario è progettato per questo> .-
Jamie Nicholl-Shelley

Perché è necessario Nodo per eseguire un test unitario. Se la versione del nodo presente è troppo obsoleta, i test semplicemente non verranno eseguiti o falliranno con errore di sintassi o smth. simile, che sconfigge il punto del test unitario. È come nascondere un modulo di reimpostazione della password dietro un modulo di autorizzazione. Se non ricordi la password, devi utilizzare la funzione di reimpostazione della password, ma ora non puoi utilizzarla perché non ricordi la password.
ankhzet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.