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, Залежності та бібліотеки