Следует ли добавить файл package-lock.json в .gitignore?

Чтобы заблокировать версии зависимостей, установленных в проекте, команда npm install создает файл с именем package-lock.json. Это было сделано после Node.js v8.0.0 и npm v5.0.0, как некоторые из вас, возможно, знают.

Несмотря на Node.js и npm рекомендации по фиксации этого файла, а также некоторые опасения относительно того, когда вам следует избегать этого, также являются вариантом. Обычно мы совершаем обязательства в наших проектах, тем не менее, это специфический вопрос.

Хотя мы должны зафиксировать package-lock.json файл по умолчанию, у нас есть особый случай, когда мы этого не делаем. Например, если мы хотим протестировать последнюю версию зависимостей нашего проекта, можно добавить package-lock.json в .gitignore.

Итак, вопросы следующие:

  1. Следует ли добавить package-lock.json файл в .gitignore?
  2. Есть ли какая-то конкретная ситуация, в которой мы ДОЛЖНЫ или НЕ ДОЛЖНЫ это делать?

person Francisco Maria Calisto    schedule 30.01.2018    source источник


Ответы (1)


Нет, package-lock.json НЕ СЛЕДУЕТ добавлять в .gitignore. Вместо этого я настоятельно рекомендую:

  1. Добавьте package-lock.json вас в свой репозиторий системы управления версиями
  2. Используйте npm ci вместо npm install при создании приложения как локально, так и в конвейере развертывания.
    (Команда ci доступна с [email protected], в случае сомнений обновите npm через:
    npm install -g npm.)

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

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

Кроме того, npm ci уничтожает всю папку node_modules перед добавлением зависимостей, гарантируя, что вы работаете со своими фактическими зависимостями, а не с локальными изменениями, при этом работая быстрее, чем обычный npm install.

Из package-lock.json вы получите именно это: состояние заведомо работоспособного.

Раньше у меня были проекты без файлов package-lock.json / npm-shrinkwrap.json / yarn.lock, сборка которых однажды вылетела из строя, потому что случайная зависимость получила критическое обновление. (Хотя многие библиотеки соблюдают рекомендации по управлению версиями semvar, у вас нет гарантии, что они не сломаются при незначительном обновлении.)

Эту проблему сложно решить, так как иногда приходится угадывать, какая была последняя рабочая версия.

Что касается тестирования последних зависимостей для вашего проекта: это то, для чего npm update, и я утверждаю, что его должен запускать разработчик, который также запускает тест локально, который решает проблемы, если они могут возникнуть, и кто затем фиксирует измененные package-lock.json. (Если обновление не удалось, они могут вернуться к последнему рабочему package-lock.json.)

Кроме того, я редко обновляю все зависимости сразу (так как это тоже может потребовать дальнейшего обслуживания), но я предпочитаю выбирать нужное мне обновление (например, npm update {dependency} или npm install {dependency}@2.1.3). Это еще одна причина, по которой я бы рассматривал это как этап обслуживания вручную.

Если вы действительно хотите автоматизировать его, вы можете создать вакансию для:

  • кассовый репозиторий
  • запустить обновление npm
  • run tests
    • if tests passes, then commit and push to repository
    • иначе не удастся и сообщить о проблеме, которую нужно решить вручную

Это то, что я бы увидел на сервере CI, например Jenkins, и этого не следует достигать по вышеупомянутой причине путем добавления файла в .gitignore.


Или чтобы процитировать документ npm:

Настоятельно рекомендуется передать сгенерированную блокировку пакета в систему управления версиями: это позволит любому члену вашей команды, вашим развертываниям, вашей CI / непрерывной интеграции и всем, кто запускает npm install в вашем источнике пакета, получить точно такое же дерево зависимостей. что вы развивались. Кроме того, различия этих изменений удобочитаемы и сообщают вам обо всех изменениях, внесенных npm в ваши node_modules, чтобы вы могли заметить, были ли какие-либо транзитивные зависимости обновлены, подняты и т. Д.

А что касается разницы между npm ci и npm install:

  • У проекта должен быть существующий package-lock.json или npm-shrinkwrap.json.
  • Если зависимости в блокировке пакета не совпадают с зависимостями в package.json, npm ci выйдет с ошибкой вместо обновления блокировки пакета.
  • npm ci можно устанавливать только целые проекты за раз: отдельные зависимости не могут быть добавлены с помощью этой команды.
  • Если node_modules уже присутствует, он будет автоматически удален до начала установки npm ci.
  • Он никогда не будет писать в package.json или какие-либо блокировки пакетов: установки по существу замораживаются.
person k0pernikus    schedule 30.01.2018
comment
Я не согласен, хотя я использую npm install, а не npm ci. При установке npm наличие package-lock.json в репо вызывает проблемы при развертывании. см. мой ответ в заголовке stackoverflow.com/questions/44206782/ - person MagicLAMP; 11.01.2019
comment
@MagicLAMP Вам лучше использовать npm ci вместо npm install на вашем сервере сборки. Тогда ваша проблема исчезнет. - person k0pernikus; 26.08.2019
comment
Спасибо @ k0pernikus. Я попробую это сделать через неделю и снова прокомментирую. - person MagicLAMP; 28.08.2019
comment
npm ci выдает ошибку, когда npm не понимает ci как команду. Это сокращение для чего-то. Я попробовал «c» сам по себе, и это не сработало. Я попробовал «i» сам по себе, и я думаю, что он просто установил - person MagicLAMP; 28.08.2019
comment
@MagicLAMP Проверьте свою версию npm. npm ci доступен с [email protected], текущая версия - [email protected]. Вы можете обновить свой npm через npm install -g npm. - person k0pernikus; 28.08.2019
comment
@MagicLAMP И ci не является сокращением, это отдельная команда с особым поведением, а именно: она запускает node_modules, устанавливает все зависимости из package-lock.json, не изменяя его. Дополнительную информацию см. На связанной странице: docs.npmjs.com/cli/ci - person k0pernikus; 28.08.2019
comment
Fwiw .gitignore на webpack Github делает включить _2 _... - person JSStuball; 28.01.2020
comment
@JSStuball webpack использует пряжу вместо npm. В его репозитории есть yarn.lock (эквивалент package-lock.json). См. Также: github.com/webpack/webpack/pull/6930#issuecomment-377987981 - person k0pernikus; 28.01.2020
comment
@ k0pernikus наконец-то заставил npm ci работать над моим доступным развертыванием и зафиксировал блокировку пакетов в репозитории. Это позволяет моему фронтенд-разработчику развертывать вещи. Спасибо. - person MagicLAMP; 04.05.2020
comment
не используйте npm ci локально. Это тратит пропускную способность сети ... в моем случае он каждый раз загружает хром (150 МБ) - person Jundl; 01.02.2021
comment
@Jundl npm ci должен по-прежнему использовать кеш внутри ~/.npm. Он только поражает node_modules, но не всегда должен загружать все. Есть ли что-нибудь особенное в вашей настройке? - person k0pernikus; 02.02.2021
comment
хм, я разрабатываю модуль узла, и в проекте с использованием машинописного текста периодически выполняется npm install. Chromium - это зависимость разрабатываемого модуля - person Jundl; 02.02.2021
comment
@Jundl Не могли бы вы открыть новый вопрос в форме: Почему npm ci не использует кеш для определения зависимости от хрома? и ссылаться на минимальный, полный и проверяемый пример вашего package.json? Тогда я бы посмотрел. Вы можете связать свой вопрос здесь. - person k0pernikus; 02.02.2021