Я фиксирую файл package-lock.json, созданный npm 5?

788

npm 5 был выпущен сегодня, и одна из новых функций включает детерминированные установки с созданием файла package-lock.json.

Предполагается ли, что этот файл хранится в контроле источника?

Я предполагаю, что он похож на yarn.lock и composer.lock, оба из которых являются который должен храниться в контроле источника.

  • 12
    Краткий ответ: да. Один комментарий: при изменении package-lock.json вы можете сделать фиксацию только этого изменения, отдельно от других исходных изменений. Это облегчает работу с git log .
  • 7
    Файл не может помочь произвести детерминированную установку, если он не существует.
Показать ещё 2 комментария
Теги:
npm
version-control

8 ответов

963
Лучший ответ

Да, 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 будет полностью проигнорирован.

  • 0
    Отличная находка, спасибо! Я не могу дождаться, чтобы попробовать npm 5 для моих проектов на предстоящей неделе, читал отличные вещи об этом.
  • 43
    В каких проектах на самом деле полезно зафиксировать файл? Весь смысл semver и package.json в том, что обновленные совместимые зависимости не должны быть отмечены.
Показать ещё 20 комментариев
70

Да, он должен быть проверен. Я хочу предположить, что он получает свою собственную уникальную фиксацию. Мы обнаруживаем, что он добавляет много шума к нашим различиям.

  • 12
    Справедливо спорить о том, следует ли проверять его в своем репозитории исходного кода, но публикация этого файла в npm на самом деле не подлежит обсуждению - вы должны включить либо свой package-lock.json, либо файл shrinkwrap в реестр npm. если вы этого не сделаете, ваш опубликованный пакет будет подвержен неподкрепленным изменениям зависимостей ваших зависимостей 1-го поколения. вы не заметите, что это будет проблемой, пока одна из этих зависимостей 2-го поколения не опубликует критическое изменение, и ваш опубликованный пакет не получится таинственным образом поврежденным. Этот файл package-lock.json был создан для решения этой проблемы.
  • 0
    Не могли бы вы рассказать мне больше об этом "много шума для наших различий"? Я думаю, у меня есть идея, но я предпочитаю быть уверенным.
Показать ещё 5 комментариев
22

Да, лучшая практика - зарегистрироваться

Я согласен, что это вызовет много шума или конфликта при просмотре diff. Но преимущества таковы:

  1. гарантировать точно такую же версию каждого пакета. Эта часть является наиболее важной при построении в разных средах в разное время. Вы можете использовать ^1.2.3 в вашем package.json, но как вы можете быть уверены, что каждый раз, когда npm install будет подбирать одну и ту же версию на вашем компьютере разработчика и на сервере сборки, особенно эти пакеты косвенной зависимости? Что ж, package-lock.json обеспечит это. (С помощью npm ci который устанавливает пакеты на основе файла блокировки)
  2. это улучшает процесс установки.
  3. это помогает с новой функцией npm audit fix аудита npm audit fix (я думаю, что функция аудита взята из npm версии 6).
  • 1
    Насколько я знаю, никогда не использовать semver (который npm devs не понимает в любом случае) должно привести к тому же поведению, что и наличие файла блокировки, по крайней мере, в 99% случаев. Мой собственный опыт показывает, что полувернутые хакерские атаки происходят в основном с первичными пакетами (прямые зависимости, дерьмовые сборщики jquery и т. Д.). Мой личный опыт работы с npm заключается в том, что файлы блокировки всегда были шумом. Я надеюсь, что эта мудрость не изменилась с последними версиями.
  • 2
    +1 за упоминание npm ci . Люди часто упоминают, что package-lock.json допускает детерминированную установку пакетов, но почти никогда не упоминают команду, которая облегчает это поведение! Многие люди, вероятно, ошибочно полагают, что npm install устанавливает именно то, что находится в файле блокировки ...
16

Я не фиксирую этот файл в моих проектах. Какой смысл?

  1. Генерируется
  2. Это является причиной ошибки целостности кода SHA1 в gitlab со сборками gitlab-ci.yml

Хотя это правда, что я никогда не использую ^ в моем package.json для библиотек, потому что у меня был плохой опыт с этим :)

С уважением.

  • 5
    Я хотел бы, чтобы это можно было более подробно изложить в документации по npm. Было бы полезно составить план того, что конкретно вы потеряете, не package-lock.json . Некоторые репозитории могут не требовать преимуществ, связанных с их наличием, и могут предпочесть не иметь автоматически сгенерированного контента в источнике.
  • 0
    Я вижу, как это может быть полезно для отладки (например, различия между двумя блокировками) для решения проблем. Я полагаю, что это также может быть использовано для предотвращения подобных вещей, но также может быть неприятно иметь его в общем репо, где могут возникнуть конфликты слияния из-за этого. Для начала я хочу, чтобы все было просто, я буду просто использовать package.json сам по себе, пока не увижу, что существует реальная потребность в package-lock.json.
15

Людям, жалующимся на шум при выполнении 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'"
13

Да, вы можете зафиксировать этот файл. Из официальных документов npm:

package-lock.json автоматически генерируется для любых операций, где npm изменяет либо дерево node_modules, либо package.json. Он описывает точное дерево, которое было сгенерировано, так что последующие установки могут генерировать идентичные деревья, независимо от промежуточных обновлений зависимостей.

Этот файл предназначен для фиксации в исходных репозиториях [.]

  • 7
    Не будет ли установка всегда обновлять node_modules и, следовательно, обновлять package-lock.json?
1

Я использую 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 ...
-4

Отключить пакет-lock.json глобально

введите следующее в вашем терминале:

npm config set package-lock false

это действительно работает для меня, как магия

  • 1
    это создает ~/.npmrc (по крайней мере, на моих macos) с содержимым package-lock=false и то же самое можно сделать в любом конкретном проекте вместе с node_modules/ (например, echo 'package-lock=false' >> .npmrc
  • 2
    Мне смешно, что это будет негативно. Сообщество npm просто не может смириться с тем, что автоматическая генерация package-lock.json была плохим участием сообщества. Вы не должны делать вещи, которые могут повлиять на процесс команды. это должна была быть опция включения, а не принудительная. сколько людей просто делают "git add *" и даже не замечают этого и не испортили сборки. Если у вас есть какой-либо поток, основанный на слиянии, я знаю, что git-поток похож на библию для людей, которые его используют, это не сработает. Вы не можете иметь поколение на слияние! Версия npm не работает, пакет: 1.0.0 должен быть детерминированным!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню