Я только недавно обновился до npm @ 5 . Теперь у меня есть файл package-lock.json со всем из package.json . Я ожидаю, что при запуске npm install
версии зависимостей будут извлечены из файла блокировки, чтобы определить, что должно быть установлено в моем каталоге node_modules . Что странно, так это то, что он на самом деле модифицирует и переписывает мой файл package-lock.json .
Например, для файла блокировки была указана машинописная версия версии 2.1.6 . Затем после npm install
команды версия была изменена на 2.4.1 . Это, кажется, побеждает всю цель файла блокировки.
Что мне не хватает? Как мне заставить npm действительно уважать мой файл блокировки?
node.js
npm
npm-install
package-lock.json
Гадюка Бейли
источник
источник
package-lock.json
восстанавливается, когда я бегуnpm install
. Это пахнет как ошибка npm. Вы используете свой собственный реестр?--no-save
предотвращает изменение файла блокировки, но это не влияет на глупое обновление зависимостей первого уровня, которое упоминает OP.Ответы:
Обновление 3: Как отмечают и другие ответы,
npm ci
команда была введена в npm 5.7.0 как дополнительный способ достижения быстрой и воспроизводимой сборки в контексте CI. См. Документацию и блог npm для получения дополнительной информации.Обновление 2: проблема для обновления и уточнения документации - проблема GitHub # 18103 .
Обновление 1: Поведение, которое было описано ниже, было исправлено в npm 5.4.2: предполагаемое в настоящее время поведение описано в выпуске GitHub # 17979 .
Оригинальный ответ: Поведение
package-lock.json
было изменено в npm 5.1.0, как обсуждалось в выпуске № 16866 . Поведение, которое вы наблюдаете, очевидно, предназначено для npm начиная с версии 5.1.0.Это означает, что
package.json
может переопределятьpackage-lock.json
всякий раз, когда для зависимости вpackage.json
. Найдена более новая версия . Если вы хотите эффективно закрепить свои зависимости, теперь вы должны указать версии без префикса, например, вам нужно записать их как1.2.0
вместо~1.2.0
или^1.2.0
. Тогда комбинацияpackage.json
иpackage-lock.json
даст воспроизводимые сборки. Чтобы было ясно:package-lock.json
один больше не блокирует зависимости корневого уровня!Является ли это проектное решение было хорошо или не является спорным, существует постоянная дискуссия в результате этой путаницы на GitHub в вопросе # 17979 . (На мой взгляд, это сомнительное решение; по крайней мере, имя
lock
больше не соответствует действительности.)Еще одно замечание: есть также ограничение для реестров, которые не поддерживают неизменяемые пакеты, например, когда вы извлекаете пакеты непосредственно из GitHub вместо npmjs.org. См. Эту документацию блокировок пакетов для дальнейшего объяснения.
источник
npm update
для тогда? : o У меня было такое же чувство, чтоnpm install
обновленный deps, но я не хочу в это верить ... но кажется, что это печально, правда. В любом случае, есть еще возможность использоватьnpm shrinkwrap
для блокировки deps, но определенно имя package-lock неверно как это не замораживает, не блокирует зависимости ..Я обнаружил, что будет новая версия npm 5.7.1 с новой командой
npm ci
, которая будет устанавливатьсяpackage-lock.json
только систочник
npm install
» перед запуском командыnpm ci
в этом проекте. Неnpm install
перезаписывает файл package-lock.json?npm
только изменяет файл блокировки, если это необходимо, чтобы соответствовать спецификации в packages.json . Так что, если пакеты говорилиthatpackage: 1
и «блокировка» говорит..: 1.0.4
, dev может редактировать, чтобы сказатьthatpackage: 2
- и это заставит файл блокировки измениться, потому что1.0.4
он не совместим с новым указанным диапазоном. Если не изменитьpackages.json
, останется заблокированным в точной версии, пока не удалите файл блокировки. [Если не будут заблокированы, и не изменял packages.json, отчет об ошибке.]Используйте недавно представленный
Представляем
npm ci
для более быстрой и надежной сборкиисточник
npm ci
толькоnpm install
при обновлении или установке новых пакетов.node_modules
каталог и восстанавливает его локально, даже если это пустая, но важная символическая ссылка. :(npm ci
я полагаю, они будут очень неохотно представлять все, что может снизить производительность для довольно необычного варианта использования. Возможно, вы захотите проверить pnpm.js.org, хотя он использует жесткие ссылки для уменьшения использования диска.Короткий ответ:
npm install
уважает package-lock.json, только если он удовлетворяет требованиям package.json.npm ci
.Вот сценарий, который может объяснить вещи (проверено с помощью NPM 6.3.0)
Вы объявляете зависимость в package.json как:
Затем вы делаете,
npm install
что сгенерирует package-lock.json с:Несколькими днями позже выпущена более новая вспомогательная версия «depA», скажем «1.1.0», тогда справедливо следующее:
Затем вы вручную обновляете свой package.json:
Затем перезапустите:
источник
npm install
будет использовать заблокированные версии из,package-lock.json
если только он не удовлетворяет тому,package.json
в каком случае он устанавливает package.json и соответственно перестраивает package-lock.json. Если вы изменили своюpackage.json
package.json
package-lock
npm install
он ничего не делает, независимо от package-lock.json. Мы должны явно обновлять пакеты, даже когда есть доступные обновления, которые соответствуют semver, указанному в package.json. По крайней мере, это был мой опыт в течение многих лет.node_modules
удовлетворяет диапазонуpackage.json
, и нетpackage-lock.json
файла, npm не будет обновлять модуль при работеnpm install
. Я думаю, это нормально, так как вы можете использоватьnpm update
(илиnpm-check
для последних) обновление зависимостей, и это происходит быстрее в случае, когда кто-то просто добавляет одну записьpackage.json
, и не хочет, чтобы несвязанные пакеты обновляли себя до последней версии, которая удовлетворяет полу-версии. спектр.Используйте
npm ci
команду вместоnpm install
.«ci» означает «непрерывная интеграция».
Он установит зависимости проекта на основе файла package-lock.json вместо зависимостей файла lenient package.json.
Он будет производить идентичные сборки для ваших товарищей по команде, и это также намного быстрее.
Вы можете прочитать больше об этом в этом блоге: https://blog.npmjs.org/post/171556855892/introduction-npm-ci-for-faster-more-reliable
источник
ci
относится к «непрерывной интеграции», как упоминалось в документации и сообщении в блоге, объявляющем о команде: blog.npmjs.org/post/171556855892/…node_modules
папку и заново создаст ее с нуля. Это действительно намного быстрее? Есть лиnpm install
удалениеnode_modules
папки, тоже?npm install
он должен разрешить все зависимости пакета при запуске.npm ci
это просто список покупок "получить эти точные модули".В будущем вы сможете использовать
--from-lock-file
(или аналогичный) флаг для установки только изpackage-lock.json
без его изменения.Это будет полезно для CI и т. Д. Сред, где важны воспроизводимые сборки.
См. Https://github.com/npm/npm/issues/18286 для отслеживания этой функции.
источник
npm ci
что также обрабатывает ваш вопрос.Кажется, эта проблема исправлена в npm v5.4.2
https://github.com/npm/npm/issues/17979
(Прокрутите вниз до последнего комментария в теме)
Обновить
Фактически исправлено в 5.6.0. В 5.4.2 была кросс-платформенная ошибка, которая вызывала проблему.
https://github.com/npm/npm/issues/18712
Обновление 2
Смотрите мой ответ здесь: https://stackoverflow.com/a/53680257/1611058
npm ci
это команда, которую вы должны использовать при установке существующих проектов сейчас.источник
npm i
. Например, модульfsevents
удаляется, когда яnpm i
на машине, которая не поддерживает,fsevents
и затем модуль повторно добавляется, когда одинnpm i
снова на машине, которая поддерживает.fsevents
падение, чтоpackage-lock.json
иnpm@5.5
при работе с участниками Mac OS X. Если вы не открыли вопрос, я буду.Вы, вероятно, что-то вроде:
в вашем,
package.json
который npm обновляет до последней минорной версии, в вашем случае2.4.1
Подробнее о
package-lock.json
:package-lock.json автоматически генерируется для любых операций, где npm изменяет либо дерево node_modules, либо package.json. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.
Этот файл предназначен для фиксации в исходных хранилищах и предназначен для различных целей:
https://docs.npmjs.com/files/package-lock.json
источник
package-lock.json
а затем мы запускаемnpm install
, ноpackage-lock.json
файл изменяется, и мы должны выполнить сброс, прежде чем сможем извлечь следующие изменения.Вероятно, вы должны использовать что-то вроде этого
Вместо использования,
npm install
если вы не хотите менять версию вашего пакета.Согласно официальной документации, оба
npm install
иnpm ci
устанавливаем зависимости, которые необходимы для проекта.источник
Существует открытая проблема для этого на их странице GitHub: https://github.com/npm/npm/issues/18712
Эта проблема наиболее серьезна, когда разработчики используют разные операционные системы.
источник
РЕДАКТИРОВАТЬ: название «замок» хитрый, его NPM пытается догнать пряжи. Это не заблокированный файл вообще.
package.json
является фиксированным пользователем файлом, который после "установки" сгенерирует дерево папок node_modules, и это дерево будет записано вpackage-lock.json
. Итак, вы видите, все наоборот - версии зависимостей будут извлеченыpackage.json
как всегда, иpackage-lock.json
их следует вызыватьpackage-tree.json
(надеюсь, это сделало мой ответ более ясным после стольких отрицательных голосов)
Упрощенный ответ: сохраняйте
package.json
свои зависимости как обычно, в то время какpackage-lock.json
это «точное и, что более важно, воспроизводимое дерево node_modules» (взято из самой документации npm). ).Что касается хитрого имени, его NPM пытается догнать пряжу.
источник