npm 5 был выпущен сегодня, и одна из новых функций включает детерминированные установки с созданием package-lock.json
файла.
Этот файл должен храниться в системе контроля версий?
Я предполагаю, что это похоже на yarn.lock
и composer.lock
, оба из которых должны храниться в системе контроля версий.
git log
легче иметь дело.Ответы:
Да,
package-lock.json
предназначен для проверки в системе контроля версий. Если вы используете npm 5, вы можете увидеть это в командной строке:created a lockfile as package-lock.json. You should commit this file.
Согласноnpm help package-lock.json
:источник
package-lock.json
своих.gitignore
... это доставляло мне гораздо больше проблем, чем их решение. Он всегда конфликтует, когда мы сливаем или перебазируем, и когда слияние приводит кpackage-lock.json
повреждению на CI-сервере, это просто боль, чтобы продолжать его исправлять.Да, он предназначен для регистрации. Я хочу предположить, что он получает свой уникальный коммит. Мы находим, что это добавляет много шума в наши различия.
источник
package-lock.json
файла при работе в системе SCM со стволами и ветвлениями? Я делаю некоторые изменения в ветке, которую нужно объединить с транком ... Должен ли я теперь (как-то) разрешать конфликты между двумяpackage-lock.json
файлами? Это больно.Да, ты должен:
package-lock.json
.npm ci
вместо того, чтобыnpm install
создавать приложения как на CI, так и на локальной машине разработкиnpm ci
Рабочий процесс требует существования такихpackage-lock.json
.Большим недостатком
npm install
команды является ее неожиданное поведение, которое она может изменитьpackage-lock.json
, тогда какnpm ci
использует только версии, указанные в файле блокировки, и выдает ошибкуpackage-lock.json
иpackage.json
не синхронизированыpackage-lock.json
отсутствует.Следовательно, работает
npm install
локально, особенно в больших командах с несколькими разработчиками, может привести к большому количеству конфликтов внутри,package-lock.json
и разработчики решат полностью удалитьpackage-lock.json
вместо них.Тем не менее, существует серьезный пример использования для уверенности в том, что зависимости проекта разрешаются многократно и надежно на разных машинах.
От a
package-lock.json
вы получаете именно это: состояние, известное работе.В прошлом у меня были проекты без
package-lock.json
/npm-shrinkwrap.json
/yarn.lock
файлов, сборка которых однажды не удалась, потому что случайная зависимость получила критическое обновление.Эту проблему трудно решить, так как иногда приходится догадываться, какой была последняя рабочая версия.
Если вы хотите добавить новую зависимость, вы все равно запускаете
npm install {dependency}
. Если вы хотите обновить, используйте либоnpm update {dependency}
илиnpm install ${dependendency}@{version}
и подтвердите измененияpackage-lock.json
.Если обновление не удалось, вы можете вернуться к последней известной работе
package-lock.json
.Чтобы процитировать npm doc :
И что касается разницы между
npm ci
противnpm install
:Примечание: я разместил аналогичный ответ здесь
источник
whose build would fail one day because a random dependency got a breaking update
проблем. Хотя это оставляет возможность зависимости ребенка, вызывая ту же проблему.Да, лучше всего регистрироваться (ДА, CHECK-IN)
Я согласен, что это вызовет много шума или конфликта при просмотре diff. Но преимущества таковы:
^1.2.3
в вашемpackage.json
, но , как может у обеспечить каждый раз , когдаnpm install
подберет ту же версию в вашем Dev машине и на сервере сборки, особенно те косвенные пакеты с зависимостями? Хорошо,package-lock.json
обеспечу это. (С помощьюnpm ci
которого устанавливаются пакеты на основе файла блокировки)npm audit fix
(я думаю, что функция аудита из npm версии 6).источник
npm ci
. Люди часто упоминают, что apackage-lock.json
допускает детерминированную установку пакетов, но почти никогда не упоминают команду, которая облегчает такое поведение! Многие люди, вероятно, ошибочно полагаютnpm install
, что устанавливает именно то, что находится в файле блокировки ...npm ci
. Ваша команда / ведущий разработчик может решить, когда обновить. Если все просто произвольно совершают это, в этом нет никакого смысла, и это просто создает шум в вашем репо. Документация NPM должна прояснить это. Я думаю, что большинство разработчиков просто смущены этой функцией.Я не фиксирую этот файл в своих проектах. В чем смысл ?
Хотя это правда, что я никогда не использую ^ в моем package.json для библиотек, потому что у меня был плохой опыт с этим.
источник
package-lock.json
. Некоторые репозитории могут не требовать преимуществ, связанных с их наличием, и могут предпочесть не иметь автоматически сгенерированного контента в источнике.Людям, жалующимся на шум при выполнении git diff:
Я использовал псевдоним:
Чтобы игнорировать package-lock.json в diff для всего репозитория (каждый, кто его использует), вы можете добавить это в
.gitattributes
:Это приводит к тому, что diff-файлы показывают, что «двоичные файлы a / package-lock.json и b / package-lock.json различаются при каждом изменении файла блокировки пакета. Кроме того, некоторые службы Git (в частности, GitLab, но не GitHub) также исключают эти файлы (не более 10 тыс. строк изменено!) из различий при просмотре онлайн при этом.
источник
gd() { git diff --color-words $1 $2 -- :!/yarn.lock :!/package-lock.json; }
в .bashrc вместо псевдонима.Да, вы можете зафиксировать этот файл. Из официальных документов npm :
источник
npm ci
установку из пакета package.jsonОтключить пакет-lock.json глобально
введите в своем терминале следующее:
это действительно работает для меня, как магия
источник
~/.npmrc
(по крайней мере, на моих macos) с контентом,package-lock=false
и то же самое можно сделать в любом конкретном проекте рядомnode_modules/
(например,echo 'package-lock=false' >> .npmrc
Да, это стандартная практика для фиксации package-lock.json
Основная причина совершения package-lock.json заключается в том, что все в проекте используют одну и ту же версию пакета.
Плюсы: -
Минусы: -
Редактировать: - установка npm не гарантирует, что все в проекте имеют одинаковую версию пакета. npm ci поможет с этим.
источник
npm ci
вместоnpm install
.Я использую npm для создания уменьшенных / увеличенных css / js и для создания javascript, необходимого на страницах, обслуживаемых приложением django. В моих приложениях Javascript запускается на странице для создания анимации, иногда выполняет вызовы ajax, работает в рамках VUE и / или работает с CSS. Если package-lock.json имеет некоторый переопределенный контроль над тем, что находится в package.json, то может потребоваться, чтобы была одна версия этого файла. По моему опыту, это либо не влияет на то, что установлено с помощью npm install, либо, если это так, на сегодняшний день не оказало негативного влияния на приложения, которые я развернул, насколько мне известно. Я не использую mongodb или другие подобные приложения, которые традиционно являются тонкими клиентами.
Я удаляю package-lock.json из репозитория, поскольку npm install создает этот файл, а npm install является частью процесса развертывания на каждом сервере, на котором выполняется приложение. Контроль версий узла и npm выполняется вручную на каждом сервере, но я осторожен, что они одинаковы.
Когда
npm install
он запускается на сервере, он изменяет package-lock.json, и если в файл, записанный репо на сервере, вносятся изменения, при следующем развертывании НЕ БУДЕТ извлекать новые изменения из источника. То есть вы не можете развернуть, потому что pull будет перезаписывать изменения, сделанные в package-lock.json.Вы даже не можете перезаписать локально сгенерированный package-lock.json тем, что находится в репозитории (сброс мастера жесткого происхождения), так как npm будет жаловаться, когда вы будете вводить команду, если package-lock.json не отражает то, что node_modules из-за npm install, тем самым нарушая развертывание. Теперь, если это указывает на то, что в node_modules были установлены несколько разные версии, еще раз, это никогда не вызывало у меня проблем.
Если node_modules нет в вашем репо (и не должно быть), то package-lock.json следует игнорировать.
Если я что-то упустил, пожалуйста, исправьте меня в комментариях, но смысл, что версия взята из этого файла, не имеет смысла. Файл package.json содержит номера версий, и я предполагаю, что этот файл используется для сборки пакетов при установке npm, а когда я его удаляю, npm install жалуется на следующее:
и сборка завершается неудачно, однако при установке node_modules или применении npm для сборки js / css жалоб не возникает, если я удаляю package-lock.json
источник