Ответ
Файл poetry.lock обеспечивает детерминированные (воспроизводимые) сборки проекта. Он записывает точные версии каждой зависимости и под-зависимости, которые были установлены для проекта, вместе с их хеш-суммами.
Основная задача — решить проблему, когда в pyproject.toml указаны диапазоны версий (например, requests = "^2.28.0"). Без lock-файла разные разработчики или CI/CD-системы могли бы установить разные минорные версии пакета, что потенциально может привести к ошибкам.
Ключевые характеристики:
- Воспроизводимость: Гарантирует, что команда
poetry installвсегда установит один и тот же набор пакетов на любой машине. - Безопасность: Хранит хеши пакетов для проверки их целостности при установке.
- Автоматическое управление: Файл не редактируется вручную. Он создается и обновляется командами
poetry lockилиpoetry update. - Командная работа: Этот файл необходимо коммитить в систему контроля версий (например, Git), чтобы вся команда работала с идентичным окружением.
Пример фрагмента poetry.lock:
[[package]]
name = "requests"
version = "2.31.0"
description = "Python HTTP for Humans."
category = "main"
optional = false
python-versions = ">=3.7"
[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = {version = ">=2,<4", markers = "python_version >= '3'"}
idna = {version = ">=2.5,<4", markers = "python_version >= '3'"}
urllib3 = {version = ">=1.21.1,<3", markers = "python_version >= '3'"}
[metadata]
# ...
content-hash = "..." Ответ 18+ 🔞
Смотри, объясню тебе про этот poetry.lock, чтобы ты не наступал на те же грабли, что и все мы в своё время.
Этот файл — он как твой личный стукач, блядь. Сидит, записывает всё, что происходит в твоём проекте. Ты в pyproject.toml написал что-то типа requests = "^2.28.0", а это, ёпта, не конкретная версия, а целый диапазон, типа «дай мне что-нибудь второе, главное, чтобы не третье». И вот ты такой думаешь: «Ну, всё же работает». А потом твой коллега на другой машине запускает установку, и ему Poetry, эта мартышлюшка, подсовывает уже версию 2.31.0, где какой-нибудь мелкий метод сломался. И всё, пиздец, у тебя CI/CD падает, а ты сидишь и чешешь репу: «У меня же на локалке работало!».
Вот от этой ебалы poetry.lock и спасает. Он фиксирует всё до последнего винтика: точную версию каждой библиотеки, каждой под-зависимости, и даже их хеш-суммы, чтобы проверить, не подсунули ли тебе какую-нибудь левую сборку с вирусом. Это гарантия, что команда poetry install установит один и тот же набор пакетов хоть у тебя, хоть на сервере, хоть у твоего кота, если он вдруг захочет потестить.
Что важно запомнить, чтобы не быть мудаком:
- Не трогай его руками! Это священный скрижаль, который генерируется автоматически. Хочешь обновить зависимости? Используй
poetry updateилиpoetry lock. - Обязательно коммить в Git! Это не мусорный файл, это документ стратегической важности. Если его не будет в репозитории, то у твоей команды начнётся волнение ебать, потому что окружения разъедутся. Все должны работать с одним и тем же набором.
- Безопасность — наше всё. Хеши там не просто так. Это чтобы какой-нибудь пидарас шерстяной не подменил пакет на вредоносный при скачивании.
Вот смотри, как он выглядит внутри — кусок про requests:
[[package]]
name = "requests"
version = "2.31.0" # <-- Вот она, конкретная версия! Не «примерно такая», а именно эта.
description = "Python HTTP for Humans."
category = "main"
optional = false
python-versions = ">=3.7"
[package.dependencies]
certifi = ">=2017.4.17"
charset-normalizer = {version = ">=2,<4", markers = "python_version >= '3'"}
idna = {version = ">=2.5,<4", markers = "python_version >= '3'"}
urllib3 = {version = ">=1.21.1,<3", markers = "python_version >= '3'"}
[metadata]
# ...
content-hash = "..." # <-- А это уже магия целостности. Чих-пых тебя в сраку, если не сойдётся.
Короче, считай этот файл своим личным сейфом от хаоса. Без него — это как ходить по охуенно тонкому льду. Рано или поздно провалишься.