npm 5 был выпущен сегодня, и одна из новых функций включает детерминированные установки с созданием файла package-lock.json
.
Предполагается ли, что этот файл хранится в контроле источника?
Я предполагаю, что он похож на yarn.lock
и composer.lock
, оба из которых являются который должен храниться в контроле источника.
Да, package-lock.json
предназначен для проверки в системе контроля package-lock.json
. Если вы используете npm 5, вы можете увидеть это в командной строке: created a lockfile as package-lock.json. You should commit this file.
created a lockfile as package-lock.json. You should commit this file.
Согласно npm help package-lock.json
:
package-lock.json
автоматически генерируется для любых операций, где npm изменяет либо деревоnode_modules
, либоpackage.json
. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.Этот файл предназначен для фиксации в исходных хранилищах и предназначен для различных целей:
Опишите единственное представление дерева зависимостей, чтобы товарищи по команде, развертывания и непрерывная интеграция гарантированно устанавливали одинаковые зависимости.
Предоставьте пользователям возможность "путешествовать во времени" к предыдущим состояниям
node_modules
без необходимости фиксации самого каталога.Для облегчения большей видимости изменений в дереве с помощью читаемых исходных текстов контроля.
И оптимизировать процесс установки, позволяя npm пропускать повторяющиеся разрешения метаданных для ранее установленных пакетов.
Одним из ключевых
package-lock.json
является то, что он не может быть опубликован и будет игнорироваться, если будет найден в любом месте, кроме пакета верхнего уровня. Он разделяет формат с npm-shrinkwrap.json(5), который по сути является тем же файлом, но допускает публикацию. Это не рекомендуется, если только не развертывается инструмент CLI или иным образом не используется процесс публикации для создания производственных пакетов.Если в корне пакета присутствуют и
package-lock.json
иnpm-shrinkwrap.json
package-lock.json
, тоpackage-lock.json
будет полностью проигнорирован.
Да, он должен быть проверен. Я хочу предположить, что он получает свою собственную уникальную фиксацию. Мы обнаруживаем, что он добавляет много шума к нашим различиям.
Да, лучшая практика - зарегистрироваться
Я согласен, что это вызовет много шума или конфликта при просмотре diff. Но преимущества таковы:
^1.2.3
в вашем package.json
, но как вы можете быть уверены, что каждый раз, когда npm install
будет подбирать одну и ту же версию на вашем компьютере разработчика и на сервере сборки, особенно эти пакеты косвенной зависимости? Что ж, package-lock.json
обеспечит это. (С помощью npm ci
который устанавливает пакеты на основе файла блокировки)npm audit fix
аудита npm audit fix
(я думаю, что функция аудита взята из npm версии 6).npm ci
. Люди часто упоминают, что package-lock.json
допускает детерминированную установку пакетов, но почти никогда не упоминают команду, которая облегчает это поведение! Многие люди, вероятно, ошибочно полагают, что npm install
устанавливает именно то, что находится в файле блокировки ...
Я не фиксирую этот файл в моих проектах. Какой смысл?
Хотя это правда, что я никогда не использую ^ в моем package.json для библиотек, потому что у меня был плохой опыт с этим :)
С уважением.
package-lock.json
. Некоторые репозитории могут не требовать преимуществ, связанных с их наличием, и могут предпочесть не иметь автоматически сгенерированного контента в источнике.
Людям, жалующимся на шум при выполнении git diff:
git diff -- . ':(exclude)*package-lock.json'
я использовал псевдоним
alias gd="git diff --ignore-all-space --ignore-space-at-eol --ignore-space-change --ignore-blank-lines -- . ':(exclude)*package-lock.json'"
Да, вы можете зафиксировать этот файл. Из официальных документов npm:
package-lock.json
автоматически генерируется для любых операций, гдеnpm
изменяет либо деревоnode_modules
, либоpackage.json
. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.Этот файл предназначен для фиксации в исходных репозиториях [.]
Я использую 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 жалуется на следующее:
jason@localhost:introcart_wagtail$ rm package.json
jason@localhost:introcart_wagtail$ npm install
npm WARN saveError ENOENT: no such file or directory, open '/home/jason/webapps/introcart_devtools/introcart_wagtail/package.json'
и сборка завершается неудачно, однако, при установке node_modules или применении npm для сборки js/css, никаких претензий не возникает, если я удаляю package-lock.json
jason@localhost:introcart_wagtail$ rm package-lock.json
jason@localhost:introcart_wagtail$ npm run dev
> [email protected] dev /home/jason/webapps/introcart_devtools/introcart_wagtail
> NODE_ENV=development webpack --progress --colors --watch --mode=development
10% building 0/1 modules 1 active ...
Отключить пакет-lock.json глобально
введите следующее в вашем терминале:
npm config set package-lock false
это действительно работает для меня, как магия
~/.npmrc
(по крайней мере, на моих macos) с содержимым package-lock=false
и то же самое можно сделать в любом конкретном проекте вместе с node_modules/
(например, echo 'package-lock=false' >> .npmrc
git log
.