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?

Erel Segal-Halevi
źródło
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.

IBam
źródło
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
Mikel
źródło
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).

Adam
źródło
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.

Ciro Santilli
źródło
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

vnglst
źródło
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);
    });});
Jamie Nicholl-Shelley
źródło
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