Jak mogę określić wymaganą wersję Node.js w package.json?


261

Mam projekt Node.js, który wymaga Node w wersji 12 lub wyższej. Czy istnieje sposób na określenie tego w pliku packages.json, aby instalator automatycznie sprawdził i poinformował użytkowników o konieczności aktualizacji?


1
Podobny sposób do odpowiedzi Adama, również przy użyciu node.version: stackoverflow.com/a/48691987/3032209
Yair Kukielka


Pytanie zostało już zadane tutaj: Jak wymusić użycie określonej wersji node.js?
cilap

Zastanawiam się, czy istnieje narzędzie, które może automatycznie ustawić odpowiednią wartość w tym polu, sprawdzając użycie interfejsu API.
geekley,

Odpowiedzi:


287

Myślę, że możesz użyć pola „silniki”:

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

Ponieważ mówisz, że Twój kod na pewno nie będzie działał z żadnymi niższymi wersjami, prawdopodobnie chcesz też flagi „engineStrict”:

{ "engineStrict" : true }

Dokumentacja pliku package.json znajduje się na stronie npmjs

Aktualizacja

engineStrictjest teraz przestarzałe, więc będzie to tylko ostrzeżenie. Teraz to użytkownik musi uruchomić, npm config set engine-strict truejeśli tego chce.

Aktualizacja 2

Jak wskazano poniżej, utworzenie .npmrcpliku w katalogu głównym projektu (na tym samym poziomie co plik package.json) z tekstem engine-strict=truewymusi błąd podczas instalacji, jeśli wersja węzła nie jest kompatybilna.


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "Rzadko używana opcja package.json engineStrictjest przestarzała przez kilka miesięcy, powodując wyświetlanie ostrzeżeń, gdy była używana. Począwszy od npm @ 3, wartość parametru pole jest ignorowane, a naruszenia silnika będą generować tylko ostrzeżenia. Jeśli jako użytkownik chcesz mieć ścisłe wymuszenie w terenie silników, po prostu uruchom npm config set motor-strict true ”
Mike Stead

1
Pamiętaj cd .. && npm i <folder-name>, aby sprawdzić sam projekt. Spowoduje to jednak uruchomienie całego kompilacji.
mlunoe

6
dlaczego, do licha, przestali go
traktować

15
Dodanie engine-strict=truedo .npmrc ma teraz ten sam efekt
ben

4
@ben Perfect, dziękuję! Można to zrobić, aby przynajmniej cały zespół był zobowiązany do przestrzegania wymagań wersji silnika.
Joshua Pinter

115

Dodaj

do package.json

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

do pliku .npmrc(blisko tego package.jsonsamego katalogu)

engine-strict=true

3
Jest to najłatwiejsze rozwiązanie, które daje użytkownikowi końcowemu niezły błąd polegający na tym, że nie ma odpowiedniej wersji węzła podczas działania npm install; współpracuje yarnrównież z
jcollum

To wydaje się nie mieć żadnego efektu. Skonfigurowałem mój package.jsonz sekcją „silniki” podobną do powyższej ( 11.13.0i 6.7.0) oraz .npmrcz niczym innym, jak zawartością powyżej. Miałem nvm przestawił mnie na starszą wersję węzła, a następnie uruchomiłem npm install, ale to po prostu instaluje zależności i nawet nie wspomina o niezgodności wersji silnika.
Adrian

54

Tak jak powiedział Ibam, engineStrictjest teraz przestarzały. Ale znalazłem to rozwiązanie:

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

Dowiedz się więcej tutaj: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

I jeszcze jedno. Pliku dot. „.Nvmrc” można użyć do wymagania określonej wersji węzła - https://github.com/creationix/nvm#nvmrc

Ale jest to przestrzegane tylko przez skrypty npm (i skrypty przędzy).


2
To najlepsza odpowiedź w 2019 r., Biorąc pod uwagę wycofanie ustawionego silnika i fakt, że wielu (prawdopodobnie) napotyka to z powodu przełączania wersji za pomocą nvm.
rzemieślniczy

14

.nvmrc

Jeśli używasz NVM w ten sposób , co prawdopodobnie powinieneś, możesz wskazać wersję nodejs wymaganą dla danego projektu w .nvmrcpliku śledzenia git :

echo v10.15.1 > .nvmrc

Nie działa to automatycznie cd, co jest rozsądne: użytkownik musi wtedy:

nvm use

a teraz ta wersja węzła zostanie użyta dla bieżącej powłoki.

Możesz wyświetlić listę posiadanych wersji węzła:

nvm list

.nvmrcjest udokumentowany na stronie : https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

Jak automatycznie wybrać tę wersję węzła, cdzapytano na: Automatycznie przełącz na poprawną wersję węzła na podstawie projektu

Testowane z NVM 0.33.11.


8

Istnieje inny, prostszy sposób:

  1. npm install Node@8 (zapisuje węzeł 8 jako zależność w pliku package.json)
  2. Twoja aplikacja będzie działać przy użyciu Node 8 dla każdego - nawet dla użytkowników Yarn!

Działa nodeto, ponieważ jest to tylko pakiet, który dostarcza węzeł jako pakiet binarny. Zawiera tylko jako node_module / .bin, co oznacza, że ​​udostępnia węzeł tylko dla pakietów skryptów. Nie główna powłoka.

Zobacz dyskusję na Twitterze tutaj: https://twitter.com/housecor/status/962347301456015360


5
Nie zgadzam się, potencjalnie ukryłoby to problem i odłożyłoby inną wersję węzła, gdyby nie zostało zainstalowane.
Brendan Hannemann

7
-1, ponieważ jest to okropny (naprawdę okropny) pomysł. To tak, jakby powiedzieć, że jeśli jesteś bezrobotny, powinieneś najpierw założyć firmę i możesz zacząć tam pracować.
ozanmuyes

2
Brzmi dla mnie jak świetny pomysł. Oddzielne wersje węzłów dla oddzielnych projektów. Można bezpiecznie uaktualnić jedną bez aktualizacji pozostałych. Tylko catch musi działać w .bin, ./node node-sassa nie tylko node-sass. Nie jestem pewien, czy to samo dla wszystkich plików .bin.
Jon

2
To proste i eleganckie rozwiązanie - tak długo, jak członkowie zespołu pracujący nad produktem wiedzą, że tak się dzieje, myślę, że to świetna odpowiedź. Korzystamy z tej techniki w dużej firmie, aby radzić sobie z różnorodnymi wersjami węzłów dla kilkunastu produktów front-endowych. Eliminuje potrzebę ciągłego przełączania za pomocą nvm podczas przechodzenia między produktami.
Nathan Bedford

2
To rozwiązanie ma swoje zalety i wady. Hermetyzacja wersji węzłów jest potencjalnie jej największą zaletą. Minusem jest rozdęty rozmiar obrazu dokera, jeśli zamierzasz go wdrożyć w ten sposób.
ivosh

0

Przykład przypadku testowego 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
Nie powinien to być test jednostkowy, użyj package.json / dotfiles
bgcode

2
Ale cóż, test jednostkowy jest przeznaczony do tego> .-
Jamie Nicholl-Shelley

Ponieważ potrzebujesz Węzła, aby uruchomić test jednostkowy. Jeśli obecna wersja węzła jest zbyt przestarzała, testy po prostu nie zostaną uruchomione lub zakończą się błędem składni lub błędem. podobne, co pokonuje punkt testów jednostkowych. To jak ukrycie formularza resetowania hasła za formularzem autoryzacji. Jeśli nie pamiętasz hasła, musisz użyć funkcji resetowania hasła, ale teraz nie możesz go użyć, ponieważ nie pamiętasz hasła.
ankhzet
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.