Как я могу указать требуемую версию Node.js в package.json?
261
У меня есть проект Node.js, который требует Node версии 12 или выше. Есть ли способ указать это в файле packages.json, чтобы установщик автоматически проверял и информировал пользователей о необходимости обновления?
Здесь уже задавался вопрос: как заставить использовать конкретную версию 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 несовместима.
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тем же каталогом)
Это самое простое решение, которое дает конечному пользователю приятную полную ошибку, связанную с отсутствием правильной версии узла при запуске 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"}}
Это лучший ответ в 2019 году в свете устарелости движка и реальности того, что многие (вероятно) сталкиваются с этим из-за переключения версий с nvm.
ремесло
14
.nvmrc
Если вы используете NVM, как это , что вам, вероятно, следует, то вы можете указать версию nodejs, необходимую для данного проекта, в .nvmrcфайле с отслеживанием git :
echo v10.15.1>.nvmrc
Это не вступает в силу автоматически cd, что разумно: пользователь должен затем сделать:
nvm use
и теперь эта версия узла будет использоваться для текущей оболочки.
Вы можете перечислить версии узлов, которые у вас есть:
npm install Node@8 (сохраняет узел 8 как зависимость в package.json)
Ваше приложение будет работать с Node 8 для всех - даже для пользователей пряжи!
Это работает, потому что nodeэто просто пакет, который отправляет узел как его двоичный пакет. Он просто включает как node_module / .bin, что означает, что он делает узел доступным только для скриптов пакета. Не основная оболочка.
Я не согласен, это потенциально скрыло бы проблему и добавило бы другую версию узла, если он не был установлен.
Брендан Ханнеманн
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',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);});});
Не должно быть модульного теста, используйте package.json / dotfiles
bgcode
2
Но что, для этого предназначен модульный тест> .-
Джейми Николл-Шелли
Потому что вам нужен Node для запуска юнит-теста. Если текущая версия узла слишком устарела, тесты просто не будут запускаться или не пройдут из-за синтаксической ошибки или чего-то другого. похоже, что побеждает точку юнит-тестирования. Это как скрытие формы сброса пароля за формой авторизации. Если вы не можете вспомнить пароль, вам нужно использовать функцию сброса пароля, но теперь вы не можете использовать его, потому что вы не помните пароль.
Ответы:
Я думаю, что вы можете использовать поле «двигатели»:
Поскольку вы говорите, что ваш код определенно не будет работать с какими-либо более низкими версиями, вы, вероятно, также захотите установить флаг engineStrict:
Документацию по файлу package.json можно найти на сайте npmjs.
Обновить
engineStrict
теперь устарела, так что это будет только предупреждение. Теперь пользователь может запустить,npm config set engine-strict true
если он этого хочет.Обновление 2
Как указал Бен ниже, создание
.npmrc
файла в корневом каталоге вашего проекта (того же уровня, что и файл package.json) с текстомengine-strict=true
приведет к ошибке во время установки, если версия Node несовместима.источник
engineStrict
было устаревшим в течение нескольких месяцев, производя предупреждения , когда она была использована. Начиная с НПМ @ 3, значение из поле игнорируется, а нарушения движка будут приводить только к предупреждению. Если вы, как пользователь, хотите строгое соблюдение правил работы с движками, просто запустите npm config set engine-strict true "cd .. && npm i <folder-name>
, чтобы проверить сам проект. Тем не менее, это приведет к самому построению.engine-strict=true
к вашему .npmrc теперь имеет тот же эффектДобавить
в
package.json
в файл
.npmrc
(рядом сpackage.json
тем же каталогом)источник
npm install
; работаетyarn
такжеpackage.json
раздел с «двигателями», похожим на описанный выше (11.13.0
и6.7.0
), и.npmrc
с ничего, кроме содержимого, указанного выше. Я заставил nvm переключить меня на более старую версию узла, затем запустилnpm install
, но он просто устанавливает зависимости и даже не упоминает несоответствие версии движка.Точно так же, как сказал Ибам,
engineStrict
сейчас устарела. Но я нашел это решение:чек-version.js:
package.json:
Узнайте больше здесь: https://medium.com/@adambisek/how-to-check-minimum-required-node-js-version-4a78a8855a0f#.3oslqmig4
.nvmrc
И вот еще. Точный файл '.nvmrc' можно использовать для запроса конкретной версии узла - https://github.com/creationix/nvm#nvmrc
Но это только уважают сценарии npm (и сценарии пряжи).
источник
.nvmrc
Если вы используете NVM, как это , что вам, вероятно, следует, то вы можете указать версию nodejs, необходимую для данного проекта, в
.nvmrc
файле с отслеживанием git :Это не вступает в силу автоматически
cd
, что разумно: пользователь должен затем сделать:и теперь эта версия узла будет использоваться для текущей оболочки.
Вы можете перечислить версии узлов, которые у вас есть:
.nvmrc
задокументировано по адресу: https://github.com/creationix/nvm/tree/02997b0753f66c9790c6016ed022ed2072c22603#nvmrcКак автоматически выбирать версию этого узла,
cd
спрашивали по адресу: Автоматическое переключение на правильную версию узла в зависимости от проекта.Протестировано с NVM 0.33.11.
источник
Есть еще один, более простой способ сделать это:
npm install Node@8
(сохраняет узел 8 как зависимость в package.json)Это работает, потому что
node
это просто пакет, который отправляет узел как его двоичный пакет. Он просто включает как node_module / .bin, что означает, что он делает узел доступным только для скриптов пакета. Не основная оболочка.Смотрите обсуждение в Twitter здесь: https://twitter.com/housecor/status/962347301456015360
источник
./node node-sass
а не простоnode-sass
. Не уверен, что одинаковые для всех .bin файлов.Пример теста Mocha:
источник