Python 依赖锁定是什么
Python 依赖锁定用 pip-tools、Poetry、uv 等工具把全部传递依赖解析成带版本与哈希的锁文件。核心是「声明与锁定分离」:源码里只写直接依赖与范围(requirements.in、pyproject.toml),锁文件负责可复现(requirements.txt、poetry.lock、uv.lock)。CI 按锁安装,任何依赖变化都体现为锁文件的 diff,像代码一样走评审。
基本信息
| 适用平台 | pip / Poetry / uv / pipenv 等 Python 依赖管理链路 |
|---|---|
| 工具 | pip-tools(requirements.in → requirements.txt)、Poetry、uv |
| 哈希 | pip 的 --require-hashes 可校验每个分发件 |
| 规则 | 声明与锁定分离;锁文件入版本库并评审 |
典型使用场景
- CI 与生产部署:每次安装结果一致,告别「昨天好好的今天装不上」
- 安全审计:锁文件与哈希让依赖清单可核查、可追溯
- 多环境一致:开发、测试、生产消费同一份锁定结果
- 定期升级:用机器人重编译锁文件,升级变更走评审
- 离线构建:锁文件加预下载 wheel,支撑内网离线安装
- 版本矩阵:多 Python 版本并行测试,锁文件与目标版本一起验证
pip-tools 流程
pip-tools 流程
pip-compile requirements.in -o requirements.txt # 生成含全量传递依赖的锁
pip-compile --upgrade-package requests # 定向升级单个包
pip install --require-hashes -r requirements.txt # 按锁安装并逐件校验哈希
# uv 等价流程:uv lock、uv sync --frozen
# Poetry 等价流程:poetry lock、poetry install --sync工具与文件对照
| 工具 | 声明文件 | 锁文件 |
|---|---|---|
| pip-tools | requirements.in | requirements.txt |
| Poetry | pyproject.toml | poetry.lock |
| uv | pyproject.toml | uv.lock |
| pipenv | Pipfile | Pipfile.lock |
锁文件跨平台注意环境标记:不同操作系统可能解析出不同闭包,按目标平台生成,Windows 与 Linux 别共用一份。
与校验相关的开关
| 机制 | 作用 | 注意 |
|---|---|---|
| --require-hashes | 校验每个分发件 | 锁文件需含全量哈希行 |
| --hash 行 | 单包哈希声明 | 由编译工具自动生成 |
| --no-deps | 只装锁定集合 | 防止解析阶段引入新依赖 |
平台差异用分文件管理:按目标系统生成不同锁文件(如一份 Linux、一份 Windows),别试图让一份锁跨平台。
编译锁文件要走受控源:统一索引与代理地址,否则不同网络环境可能解析出不同闭包,锁定失去意义。