Должен ли файл 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
,
Итак, вопросы следующие:
- Если
package-lock.json
файл будет добавлен в.gitignore
? - Есть ли какая-то конкретная ситуация, которую мы ДОЛЖНЫ или НЕ ДОЛЖНЫ делать?
1 ответ
Нет, package-lock.json
НЕ следует добавлять к .gitignore
, Вместо этого я настоятельно советую:
Вы должны добавить package-lock.json
Вы в вашем хранилище контроля версий.
Я также настоятельно рекомендую использовать npm ci
вместо npm install
при создании ваших приложений, и этот рабочий процесс требует наличия package-lock.json
, (Один из самых больших недостатков npm install
Команда в том, что он может видоизменить package-lock.json
, в то время как npm ci
использует только версию в файле блокировки и выдает ошибку, если package-lock.json и package.json
не синхронизированы.)
Существует серьезный пример использования для уверенности в том, что зависимости проекта разрешаются многократно и надежно на разных машинах.
Из package-lock.json
Вы получаете именно это: состояние, известное работе.
В прошлом у меня были проекты без файлов package-lock.json / shrinkwrap / yarn.lock, сборка которых однажды не удалась, потому что случайная зависимость получила критическое обновление. Эти проблемы иногда трудно решить, так как иногда приходится догадываться, какой была последняя рабочая версия.
Что касается тестирования последних зависимостей для вашего проекта: вот что npm update
для, и я утверждаю, что он должен выполняться разработчиком, который также запускает тест локально, который решает проблему, если они могут возникнуть, и кто затем фиксирует измененный package-lock.json
, (Если обновление не удается, я могу вернуться к последней работающей package-lock.json
.)
Кроме того, я редко обновляю все зависимости одновременно, но иногда я выбираю нужное обновление. Это еще одна причина, по которой я бы воспринял это как этап обслуживания вручную.
Если вы хотите автоматизировать его, вы можете создать работу для:
- контрольный репозиторий
- запустить обновление npm
- запустить тесты
- если тесты пройдены, то зафиксируйте и отправьте в репозиторий
- в противном случае ошибка и проблема с сообщением будет решена вручную.
Это то, что я хотел бы увидеть на сервере CI, например, Jenkins, и это не должно быть достигнуто по вышеупомянутой причине путем добавления файла в .gitignore
,
Настоятельно рекомендуется передать созданную блокировку пакета в систему управления версиями: это позволит всем членам вашей команды, вашим развертываниям, вашей CI/ непрерывной интеграции и всем, кто запускает npm install в вашем источнике пакетов, получить точно такое же дерево зависимостей. что вы разрабатывали. Кроме того, различия в этих изменениях понятны человеку и сообщат вам обо всех изменениях, внесенных npm в ваши node_modules, чтобы вы могли заметить, были ли какие-либо транзитивные зависимости обновлены, выведены и т. Д.
И что касается разницы между npm ci
против npm install
:
- Проект должен иметь существующий пакет-lock.json или npm-shrinkwrap.json.
- Если зависимости в блокировке пакета не совпадают с зависимостями в package.json,
npm ci
выйдет с ошибкой, вместо обновления блокировки пакета.npm ci
можно устанавливать только целые проекты за раз: с помощью этой команды нельзя добавить отдельные зависимости.- Если
node_modules
уже присутствует, он будет автоматически удален доnpm ci
начинается его установка.- Он никогда не напишет
package.json
или любой из пакетов-замков: установки по существу заморожены.