直接回答:现代标准栈:pyproject.toml 是唯一的项目清单(PEP 621),声明元数据、依赖(版本范围)和构建后端(hatchling/setuptools);虚拟环境隔离项目解释器;锁文件(uv.lock、poetry.lock、或 pip-tools 产物)固定完整依赖树的精确版本,应用入库保证可复现,库不锁。uv 是新一代高速工具(Rust 实现),一条命令管 Python 版本、环境、解析、安装,正在收编 pip/venv/pip-tools/poetry 的分散职责。

展开解析:关键概念区分:依赖声明(dependencies = ["requests>=2"])表达兼容性意图,锁文件表达"此刻能跑的组合"——应用部署用锁文件(uv sync --locked),库发布只给范围,让下游解析。历史包袱认知:setup.py 时代的命令式构建已退场;requirements.txt 仍常见于简单部署,本质是无哈希的锁文件。工程纪律:区分运行时依赖与开发依赖(dependency-groups/optional-dependencies);CI 安装用锁定模式防"上游发版坏我构建";私有源走 index 配置别混用 --extra-index-url 裸公网(dependency confusion 风险)。工具选型判断:团队已有 poetry/pdm 继续用无妨,新项目 uv 的解析速度与一体性优势明显;发布库到 PyPI 的流程被 uv build/uv publish 同样覆盖。

追问方向:为什么库不该提交锁文件?构建后端(build backend)在打包时做什么?可复现构建还缺哪一环(哈希校验)?

(约 450 字)