EMZETT.
Войти

Lock-файлы и воспроизводимые сборки: везде одни и те же версии

Коротко: Lock-файл фиксирует точные установленные версии всех пакетов, чтобы разработка, CI и production использовали одно и то же состояние, а сборки оставались воспроизводимыми.

Подробнее: В package.json написано "express": "^4.18.0", что означает «4.18.0 или более новая 4.x». Без дополнительных мер каждая машина устанавливает разные версии в зависимости от времени: «у меня работает» становится проблемой. Lock-файл решает это.

Подробности

Что в нём?

Lock-файл содержит все прямые и транзитивные зависимости с точной версией, контрольной суммой (hash) и источником. Примеры: package-lock.json (npm), pnpm-lock.yaml, yarn.lock, Cargo.lock (Rust), poetry.lock/uv.lock (Python), Gemfile.lock, composer.lock, go.sum. Он генерируется инструментом, вручную не редактируется.

Правильное использование

  • Коммитьте lock-файл в репозиторий (для приложений; для библиотек зависит от соглашения, для CI разумно).
  • В CI и при деплое устанавливайте по lock-файлу: npm ci (вместо npm install), pip install -r requirements.txt --require-hashes, cargo build --locked. npm ci прерывается, если lock-файл и package.json не совпадают.
  • Проводите обновления осознанно (npm update, Dependabot/Renovate), проверяйте изменения в lock-файле в pull request.
  • Конфликты слияния в lock-файле: не сливайте вручную; разрешите package.json и позвольте lock-файлу сгенерироваться заново.

Воспроизводимые сборки

Цель: одинаковые входные данные → одинаковый результат (бит в бит). Для этого: lock-файлы, зафиксированные версии инструментов (.nvmrc, .tool-versions, engines), контейнеры с фиксированными базовыми образами (дайджест вместо latest), без временных меток в сборке, детерминированный порядок. Это облегчает поиск неисправностей, откаты, проверки безопасности (SBOM, подписи) и уверенность в том, что опубликованный артефакт соответствует исходному коду.

Безопасность

Lock-файлы с хешами защищают от последующей подмены пакета. Проверяйте изменённые lock-файлы в pull request (другой URL реестра). Используйте частные реестры/прокси (Artifactory, Verdaccio) для контроля. Путаницы зависимостей (dependency confusion) вы избегаете с помощью чётких пространств имён (scopes) и конфигурации реестра.

См. также: Семантическое версионирование, Dependabot и Renovate, Зависимости и библиотеки