Npm - Как на самом деле использовать package-lock.json для установки на основе заблокированных версий?
Только что обновил с 3 до 5, чтобы использовать эту функцию.
Извините, я, должно быть, упускаю что-то совершенно очевидное, но как заставить npm уважать закрепленные версии в файле package-lock.json при установке?
Допустим, у меня есть package.json
с большим количеством устаревших пакетов. npm install
приведет к появлению новых вещей и сломает мое приложение.
Например, основным пакетом, который я хочу стабилизировать, является bootstrap
- сейчас я хочу заблокировать его версию по адресу [email protected], но npm install
находит 4.0.0-beta.28.
Если я npm update
какой-либо пакет, package-lock.json обновляется.
Отпусти в мою директорию разработки.
Это моя запись в package.json для начальной загрузки:
"bootstrap": "^4.0.0-alpha.6"
И вот что я вижу для своих установленных пакетов и метаданных:
$ npm list 2>/dev/null | grep bootstrap
├─┬ [email protected]
├─┬ [email protected]
│ ├── [email protected] deduped
(env) [email protected]$ grep bootstrap package.json package-lock.json
package.json: "bootstrap": "^4.0.0-alpha.6",
package.json: "bootstrap-vue": "^0.16.1",
package-lock.json: "bootstrap": {
package-lock.json: "version": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz",
package-lock.json: "bootstrap-vue": {
package-lock.json: "version": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-0.16.1.tgz",
package-lock.json: "bootstrap": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-alpha.6.tgz",
Выглядит хорошо. Блокировка загрузочная 4.0.0-alpha.6.
Но как я на самом деле использую этот пакет-lock.json?
Вот что я сделал:
- создал новый каталог
- скопировано в package.json и package-lock.json
- побежал
npm install
.
Не хорошо. npm снова обнаружил, что бета-версия bootstrap и package-lock.json не дали никакого эффекта, фактически она была переписана с того, что сделала npm install
. Это соответствует поведению, которое вы хотите в dev, но не говорит мне, как бы я использовал файл блокировки для стабилизации своих пакетов.
(env) [email protected]$ npm list 2>/dev/null | grep bootstrap
├── [email protected]
├─┬ [email protected]
│ ├── [email protected] deduped
(env) [email protected]$ grep bootstrap package.json package-lock.json
package.json: "bootstrap": "^4.0.0-alpha.6",
package.json: "bootstrap-vue": "^0.16.1",
package-lock.json: "bootstrap": {
package-lock.json: "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.2.tgz",
package-lock.json: "bootstrap-vue": {
package-lock.json: "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-0.16.1.tgz",
package-lock.json: "bootstrap": "4.0.0-beta.2",
-
Если я удаляю package.json и у меня есть только каталог с package-lock.json, то npm install
устанавливает очень мало и оставляет мне усеченный package-lock.json
-
У установки npm есть опция --no-package-lock
, но она не позволяет обновить package-lock.json.
Как мне сказать npm установить все из package.json, но соблюдать блокировки в package-lock.json? Использую ли я команду, отличную от npm install
? Это потому, что npm install doc ссылается на блокировки в контексте установки пакета, но блокировки не применяются, когда вы полностью устанавливаете package.json?
Да, я знаю, что могу указать "bootstrap": "4.0.0-alpha.6"
, минус ^
, чтобы закрепить версию вручную.
Моя среда:
(env) [email protected]$ npm -v
5.5.1
Ответы
Ответ 1
Обновление: как указал Дейв, команда для этой ситуации теперь npm ci
. Он будет установлен из package-lock.json
и не будет обновлять его. Смотрите документацию для получения дополнительной информации.
Согласно этому комментарию члена команды npm CLI, вы описываете "ошибку с высоким приоритетом".
-
Если у вас есть package.json и вы запускаете npm i
мы создаем из него package-lock.json.
-
Если вы запустите npm i
этого package.json и package-lock.json, последний никогда не будет обновлен, даже если package.json будет доволен новыми версиями.
-
Если вы вручную отредактировали свой package.json, чтобы иметь разные диапазоны, и запустили npm i
и эти диапазоны не совместимы с вашим package-lock.json, то последний будет обновлен до версии, совместимой с вашим package.json. Дальнейшие прогоны npm i
буду как с 2 выше.
Если вы столкнетесь с ситуацией, когда [email protected]^5.4.2 изменяет файл package-lock.json, который в противном случае был совместим с парным package.json, пожалуйста, откройте новый выпуск. Такого рода вещи будут представлять собой ошибку с высоким приоритетом.
Ответ 2
Вам нужно использовать команду npm ci
для установки из package-lock.json
.
Смотрите: https://blog.npmjs.org/post/171556855892/introduction-npm-ci-for-faster-more-reliable
Ответ 3
Если вы хотите взять определенную версию, вы должны преобразовать:
"bootstrap": "^4.0.0-alpha.6"
к
"bootstrap": "4.0.0-alpha.6"
Если вы скажете npm, чтобы не обновлять последнюю версию.
Если ваш pacakge-lock.json вмешивается в ваш пакет .json, вы можете удалить его, а npm создаст новый. Я сталкивался с чем-то подобным, когда я сделал обновление тоже.