uv lock 默认不生成文件,仅输出依赖树;需显式指定 --output-file 才写入(如 pyproject.toml.lock),且其格式为 uv 专用二进制兼容 JSON,不兼容 pip-compile 或 poetry.lock。

uv lock 会生成 pyproject.toml.lock 吗
不会。默认情况下 uv lock 不写入任何文件,它只在终端输出解析后的依赖树,或通过 --output-file 指定路径才落地。这和 pip-compile 或 poetry lock 的“自动覆盖 lock 文件”行为不同——uv 更强调显式控制。
要生成标准的 pyproject.toml.lock,必须手动指定输出路径:
uv lock --output-file pyproject.toml.lock
注意:该命令不会校验 pyproject.toml 是否符合 PEP 621(即是否声明了 [project.dependencies]),只要存在合法的 [build-system] 和依赖声明,就能锁。
为什么 uv lock 生成的 lock 文件和 pip-compile 不兼容
uv lock 输出的是自研的二进制兼容格式(实际是 JSON + 自定义 schema),不是 requirements.txt 风格,也不是 poetry.lock 的 TOML 表结构。它的 lock 文件本质是供 uv sync 或 uv pip install --locked 消费的内部快照,不面向人工编辑。
常见误操作:
- 用文本编辑器手动修改
pyproject.toml.lock→ 下次uv lock会完全重写,改动丢失 - 把
uv lock输出当成requirements.txt提交到 CI →uv pip install无法直接读取,需加--locked且依赖同名 lock 文件 - 期望用
pip install -r pyproject.toml.lock→ 报错Unsupported constraint file format
如何确保 CI/CD 中环境 100% 一致
关键不是“有 lock 文件”,而是“所有环境都走同一套解析+安装路径”。uv 的一致性依赖两个动作原子绑定:
- 先用
uv lock --output-file pyproject.toml.lock生成锁文件(建议在 PR CI 中校验变更) - 部署时用
uv sync --locked(推荐)或uv pip install --locked,二者都强制跳过解析,只按 lock 文件精确安装
注意:uv sync 默认读取 pyproject.toml 并隐式调用 lock 逻辑;加 --locked 才跳过解析,严格复现 lock 内容。漏掉这个 flag,哪怕有 lock 文件,依然可能因网络、索引源差异引入新版本。
lock 文件里没 pin Python 版本怎么办
uv lock 默认不锁定 Python 解释器版本,它只锁包依赖。如果你的项目依赖特定 Python 特性(比如 3.12 的 typing.TypeAlias),需要显式声明:
[project.requires-python] = ">=3.12"
这个字段会被 uv lock 记录进 lock 文件的 metadata.requires-python 字段,并在 uv sync --locked 时校验当前 Python 是否满足。不写的话,lock 文件里就没有该约束,CI 可能用 3.11 跑通但运行时报错。
另一个容易忽略的点:如果 pyproject.toml 里用了 [tool.uv] 配置(如 index-url 或 extra-index-url),这些也会被纳入 lock 文件的元数据,影响可重现性。别只改依赖,忘了同步配置。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











