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, вы описываете "ошибку с высоким приоритетом".

  1. Если у вас есть package.json и вы запускаете npm i мы создаем из него package-lock.json.

  2. Если вы запустите npm i этого package.json и package-lock.json, последний никогда не будет обновлен, даже если package.json будет доволен новыми версиями.

  3. Если вы вручную отредактировали свой package.json, чтобы иметь разные диапазоны, и запустили npm i и эти диапазоны не совместимы с вашим package-lock.json, то последний будет обновлен до версии, совместимой с вашим package.json. Дальнейшие прогоны npm i буду как с 2 выше.

Если вы столкнетесь с ситуацией, когда [email protected]^5.4.2 изменяет файл package-lock.json, который в противном случае был совместим с парным package.json, пожалуйста, откройте новый выпуск. Такого рода вещи будут представлять собой ошибку с высоким приоритетом.

Ответ 3

Если вы хотите взять определенную версию, вы должны преобразовать:

"bootstrap": "^4.0.0-alpha.6"

к

"bootstrap": "4.0.0-alpha.6"

Если вы скажете npm, чтобы не обновлять последнюю версию.

Если ваш pacakge-lock.json вмешивается в ваш пакет .json, вы можете удалить его, а npm создаст новый. Я сталкивался с чем-то подобным, когда я сделал обновление тоже.