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