Як я можу вказати необхідну версію Node.js у package.json?


261

У мене є проект Node.js, для якого потрібна версія Node 12 або новішої. Чи є спосіб вказати це у файлі пакети.json, щоб інсталятор автоматично перевіряв і повідомляв користувачів про необхідність оновлення?


1
Подібний спосіб відповіді Адама, також використовуючи node.version: stackoverflow.com/a/48691987/3032209
Яір Kukiełka


Тут уже задавались питання: як примусити використовувати конкретну версію node.js?
кінза

Цікаво, чи є якийсь інструмент, який може автоматично встановити це поле на відповідне значення, перевіривши використання API.
geekley

Відповіді:


287

Я думаю, ви можете використовувати поле "двигуни":

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

Як ви говорите, ваш код точно не працюватиме з будь-якими нижчими версіями, ви, мабуть, хочете і прапор "engineStrict":

{ "engineStrict" : true }

Документацію для файлу package.json можна знайти на сайті npmjs

Оновлення

engineStrictтепер застаріло, тому це лише набере попередження. Тепер користувач повинен запустити, npm config set engine-strict trueякщо вони цього хочуть.

Оновлення 2

Як зазначав Бен нижче, створення .npmrcфайлу в корені проекту (того ж рівня, що і файл package.json) з текстом engine-strict=trueпризведе до помилки під час встановлення, якщо версія Node не сумісна.


13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict "Рідко використовуваний пакет.json параметр engineStrictбув застарілий протягом декількох місяців, створюючи попередження при його використанні. Починаючи з npm @ 3, значення поле ігнорується, а порушення роботи двигуна створюватимуть лише попередження. Якщо ви, як користувач, хочете суворого виконання двигунів, просто запустіть npm config встановити строгий істинний механізм "
Mike Stead

1
Пам’ятайте cd .. && npm i <folder-name>, щоб перевірити наявність самого проекту. Однак це призведе до цілковитої побудови в ньому самості.
mlunoe

6
чому на землі вони зневажили це .. воно втрачає весь свій сенс тоді
vasilakisfil

15
Додавання engine-strict=trueдо вашого .npmrc тепер має той самий ефект
бен

4
@ben Ідеально, дякую! І це можна зробити так, щоб принаймні вся ваша команда повинна дотримуватися вимог версії двигуна.
Джошуа Пінтер

115

Додайте

до package.json

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

до файлу .npmrc(близько до того package.jsonсамого каталогу)

engine-strict=true

3
Це найпростіше рішення, яке дає кінцевому користувачеві гарну помилку жиру про відсутність правильної версії вузла під час його запуску npm install; працює з yarnтакож
jcollum

Це, здається, зовсім не має ефекту. Я створив package.jsonрозділ "двигуни", подібний до вищезгаданого ( 11.13.0і 6.7.0), і а, .npmrcокрім вмісту, зазначеного вище. Я мав nvm переключити мене на більш стару версію вузла, потім запустив npm install, але він просто встановлює залежності і навіть не згадує невідповідність версії двигуна.
Адріан

54

Так само, як сказав Ібам, engineStrictзараз застаріла. Але я знайшов таке рішення:

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

Дізнайтеся більше тут: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4

.nvmrc

І ще одне. Dotfile '.nvmrc' може використовуватися для вимагання конкретної версії вузла - https://github.com/creationix/nvm#nvmrc

Але його дотримуються лише сценарії npm (та сценарії пряжі).


2
Це найкраща відповідь у 2019 році, зважаючи на застарілість двигуна та реальність, що багато хто (ймовірно) стикається з цим завдяки переключенню версій на nvm.
ремесло

14

.nvmrc

Якщо ви використовуєте подібний NVM , який ви, мабуть, повинні, тоді ви можете вказати версію nodejs, необхідну для даного проекту, у .nvmrcфайлі, відслідковуваному git :

echo v10.15.1 > .nvmrc

Це не набирає чинності автоматично cd, що є здоровим: користувач повинен зробити:

nvm use

і тепер ця версія вузла буде використовуватися для поточної оболонки.

Ви можете перелічити версії вузла, які у вас є:

nvm list

.nvmrcзадокументовано за адресою: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrc

Як автоматично вибрати ту версію вузла, на яку cdбуло задано питання: Автоматично перемикатися на правильну версію Вузла на основі проекту

Перевірено з NVM 0.33.11.


8

Є ще один, простіший спосіб зробити це:

  1. npm install Node@8 (зберігає Вузол 8 як залежність у package.json)
  2. Ваш додаток працюватиме за допомогою Node 8 для всіх, навіть користувачів Пряжі!

Це працює, тому що nodeце лише пакет, який передає вузол як свій бінарний пакет. Він просто включає node_module / .bin, що означає, що він робить лише вузол доступним для пакунків сценаріїв. Не основна оболонка.

Дивіться дискусію у Twitter тут: https://twitter.com/housecor/status/962347301456015360


5
Я не погоджуюся, це потенційно може приховати проблему, і якщо вона не була встановлена, це би завантажило іншу версію вузла.
Брендан Ханнеманн

7
-1 тому що це жахлива (дійсно жахлива) ідея. Це як би сказати, що якщо ви безробітні, вам слід спочатку фінансувати компанію, і ви можете почати працювати там.
озанмуї

2
Мені це здається чудовою ідеєю. Окремі версії вузлів для окремих проектів. Можна безпечно оновити одну, не оновлюючи інші. Тільки ловити треба бігти в .bin, ./node node-sassа не просто node-sass. Не впевнений, чи однаковий для всіх .bin файлів.
Джон

2
Це просте і елегантне рішення - доки члени команди, що працюють над продуктом, знають, що це відбувається, я думаю, що це чудова відповідь. Ми використовуємо цю техніку у великій компанії, щоб розібратися з різноманітністю версій Node для десятка веб-інтерфейсних продуктів. Знімає необхідність у постійному перемиканні з nvm при переході між продуктами вперед і назад.
Натан Бедфорд

2
У цього рішення є свої плюси і мінуси. Інкапсуляція версії вузла - це потенційно його найбільший фактор. Недоліком є ​​розмір зображення докера, якщо ви збираєтесь його розгорнути таким чином.
ivosh

0

Приклад тесту Моча:

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
Не повинно бути одиничним тестом, використовуйте package.json /
dotfiles

2
Але хоч, а для цього призначений одиничний тест> .-
Джеймі Ніколл-Шеллі

Тому що для запуску одиничного тесту вам потрібен Node. Якщо наявна версія вузла занадто застаріла, тести просто не запустяться, або вони вийдуть із ладу синтаксису чи smth. подібне, що перемагає точку одиничного тестування. Це схоже на приховування форми для скидання пароля за формою авторизації. Якщо ви не можете запам'ятати пароль, вам потрібно скористатися функцією скидання пароля, але тепер ви не можете його використовувати, оскільки ви не пам’ятаєте пароль.
ankhzet
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.