Как я могу указать требуемую версию Node.js в package.json?

261

У меня есть проект Node.js, который требует Node версии 12 или выше. Есть ли способ указать это в файле packages.json, чтобы установщик автоматически проверял и информировал пользователей о необходимости обновления?

Эрель Сегал-Халеви
источник
1
Аналогичный ответ Адама, также использующий node.version: stackoverflow.com/a/48691987/3032209
Яир Кукелька,
Здесь уже задавался вопрос: как заставить использовать конкретную версию node.js?
19
Интересно, есть ли какой-нибудь инструмент, который может автоматически установить это поле на соответствующее значение, проверяя использование API.
Geekley

Ответы:

288

Я думаю, что вы можете использовать поле «двигатели»:

{ "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 несовместима.

IBam
источник
13
github.com/npm/npm/blob/master/CHANGELOG.md#enginestrict «Опция редко используемых package.json engineStrictбыло устаревшим в течение нескольких месяцев, производя предупреждения , когда она была использована. Начиная с НПМ @ 3, значение из поле игнорируется, а нарушения движка будут приводить только к предупреждению. Если вы, как пользователь, хотите строгое соблюдение правил работы с движками, просто запустите npm config set engine-strict true "
Mike Stead
1
Не забудьте cd .. && npm i <folder-name>, чтобы проверить сам проект. Тем не менее, это приведет к самому построению.
Мюлое
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
Mikel
источник
3
Это самое простое решение, которое дает конечному пользователю приятную полную ошибку, связанную с отсутствием правильной версии узла при запуске npm install; работает yarnтакже
jcollum
1
Это, кажется, не имеет никакого эффекта вообще. Я настроил свой package.jsonраздел с «двигателями», похожим на описанный выше ( 11.13.0и 6.7.0), и .npmrcс ничего, кроме содержимого, указанного выше. Я заставил nvm переключить меня на более старую версию узла, затем запустил npm install, но он просто устанавливает зависимости и даже не упоминает несоответствие версии движка.
Адриан
54

Точно так же, как сказал Ибам, engineStrictсейчас устарела. Но я нашел это решение:

чек-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

И вот еще. Точный файл '.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

vnglst
источник
5
Я не согласен, это потенциально скрыло бы проблему и добавило бы другую версию узла, если он не был установлен.
Брендан Ханнеманн
7
-1 потому что это ужасная (действительно ужасная) идея. Это все равно, что сказать, что если вы безработный, вы должны сначала финансировать компанию, и вы можете начать работать там.
ozanmuyes
2
Звучит как отличная идея для меня. Отдельные версии узлов для отдельных проектов. Можно безопасно обновить один без обновления других. Единственный улов - работать в .bin, ./node node-sassа не просто node-sass. Не уверен, что одинаковые для всех .bin файлов.
Джон
2
Это простое и элегантное решение - пока члены команды, работающие над продуктом, знают, что это происходит, я думаю, что это отличный ответ. Мы используем эту технику в большой компании, чтобы иметь дело с различными версиями Node для десятка веб-интерфейсных продуктов. Устраняет необходимость постоянного переключения с помощью nvm при переходе назад и вперед между продуктами.
Натан Бедфорд
2
Это решение имеет свои плюсы и минусы. Инкапсуляция версии Node потенциально является ее самой большой про. Недостатком является раздутый размер образа докера, если вы собираетесь развернуть его таким образом.
ivosh 19
0

Пример теста 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
Не должно быть модульного теста, используйте package.json / dotfiles
bgcode
2
Но что, для этого предназначен модульный тест> .-
Джейми Николл-Шелли
Потому что вам нужен Node для запуска юнит-теста. Если текущая версия узла слишком устарела, тесты просто не будут запускаться или не пройдут из-за синтаксической ошибки или чего-то другого. похоже, что побеждает точку юнит-тестирования. Это как скрытие формы сброса пароля за формой авторизации. Если вы не можете вспомнить пароль, вам нужно использовать функцию сброса пароля, но теперь вы не можете использовать его, потому что вы не помните пароль.
Анхзет