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?
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.
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)
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"}}
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.
npm install Node@8 (zapisuje węzeł 8 jako zależność w pliku package.json)
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.
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',asyncfunction(){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);});});
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.
Odpowiedzi:
Myślę, że możesz użyć pola „silniki”:
Ponieważ mówisz, że Twój kod na pewno nie będzie działał z żadnymi niższymi wersjami, prawdopodobnie chcesz też flagi „engineStrict”:
Dokumentacja pliku package.json znajduje się na stronie npmjs
Aktualizacja
engineStrict
jest teraz przestarzałe, więc będzie to tylko ostrzeżenie. Teraz to użytkownik musi uruchomić,npm config set engine-strict true
jeśli tego chce.Aktualizacja 2
Jak wskazano poniżej, utworzenie
.npmrc
pliku w katalogu głównym projektu (na tym samym poziomie co plik package.json) z tekstemengine-strict=true
wymusi błąd podczas instalacji, jeśli wersja węzła nie jest kompatybilna.źródło
engineStrict
jest 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 ”cd .. && npm i <folder-name>
, aby sprawdzić sam projekt. Spowoduje to jednak uruchomienie całego kompilacji.engine-strict=true
do .npmrc ma teraz ten sam efektDodaj
do
package.json
do pliku
.npmrc
(blisko tegopackage.json
samego katalogu)źródło
npm install
; współpracujeyarn
również zpackage.json
z sekcją „silniki” podobną do powyższej (11.13.0
i6.7.0
) oraz.npmrc
z niczym innym, jak zawartością powyżej. Miałem nvm przestawił mnie na starszą wersję węzła, a następnie uruchomiłemnpm install
, ale to po prostu instaluje zależności i nawet nie wspomina o niezgodności wersji silnika.Tak jak powiedział Ibam,
engineStrict
jest teraz przestarzały. Ale znalazłem to rozwiązanie:check-version.js:
package.json:
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).
źródło
.nvmrc
Jeśli używasz NVM w ten sposób , co prawdopodobnie powinieneś, możesz wskazać wersję nodejs wymaganą dla danego projektu w
.nvmrc
pliku śledzenia git :Nie działa to automatycznie
cd
, co jest rozsądne: użytkownik musi wtedy: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:
.nvmrc
jest udokumentowany na stronie : https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrcJak automatycznie wybrać tę wersję węzła,
cd
zapytano na: Automatycznie przełącz na poprawną wersję węzła na podstawie projektuTestowane z NVM 0.33.11.
źródło
Istnieje inny, prostszy sposób:
npm install Node@8
(zapisuje węzeł 8 jako zależność w pliku package.json)Działa
node
to, 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
źródło
./node node-sass
a nie tylkonode-sass
. Nie jestem pewien, czy to samo dla wszystkich plików .bin.Przykład przypadku testowego Mocha:
źródło