跳到内容

锁定和同步

锁定是将项目依赖项解析为锁文件的过程。同步是将锁文件中的部分包安装到项目环境中的过程。

自动锁定与同步

在 uv 中,锁定和同步是自动进行的。例如,当使用 uv run 时,会在调用请求的命令之前对项目进行锁定和同步。这确保了项目环境始终是最新的。同样,读取锁文件的命令(如 uv tree)也会在运行前自动更新锁文件。

要禁用自动锁定,请使用 --locked 选项

$ uv run --locked ...

如果锁文件不是最新的,uv 将报错,而不会更新锁文件。

若要在不检查锁文件是否为最新的情况下使用它,请使用 --frozen 选项

$ uv run --frozen ...

同样,若要在不检查环境是否为最新的情况下运行命令,请使用 --no-sync 选项

$ uv run --no-sync ...

检查锁文件

当判断锁文件是否为最新时,uv 会检查它是否与项目元数据匹配。例如,如果您向 pyproject.toml 添加了依赖项,锁文件将被视为过期。类似地,如果您更改了依赖项的版本约束,使得已锁定的版本被排除在外,锁文件也会被视为过期。但是,如果您更改了版本约束,而现有的已锁定版本仍然满足要求,那么锁文件仍将被视为最新。

您可以通过向 uv lock 传递 --check 标志来检查锁文件是否为最新

$ uv lock --check

这等同于其他命令中的 --locked 标志。

重要

当包发布新版本时,uv 不会将锁文件视为过期 —— 如果您想升级依赖项,则需要显式更新锁文件。有关详细信息,请参阅关于升级已锁定包版本的文档。

创建锁文件

虽然锁文件是自动创建的,但也可以使用 uv lock 显式创建或更新它

$ uv lock

同步环境

虽然环境是自动同步的,但也可以使用 uv sync 显式同步它

$ uv sync

手动同步环境对于确保您的编辑器拥有正确的依赖版本特别有用。

可编辑安装

当环境同步时,uv 会将项目(以及其他工作区成员)作为可编辑包安装,这样对代码的更改无需重新同步即可反映在环境中。

要选择不使用此行为,请使用 --no-editable 选项。

注意

如果项目没有定义构建系统,它将不会被安装。有关详细信息,请参阅构建系统文档。

处理额外包

uv sync 默认执行“精确”同步,这意味着它将删除任何不存在于锁文件中的包。

要保留额外包,请使用 --inexact 标志

$ uv sync --inexact

相比之下,uv run 默认使用“非精确”同步,确保安装所有必需的包,但不删除额外包。若要在 uv run 中启用精确同步,请使用 --exact 标志

$ uv run --exact ...

同步可选依赖

uv 从 [project.optional-dependencies] 表中读取可选依赖项。这些通常被称为“extras”。

uv 默认不同步 extras。请使用 --extra 选项来包含特定的 extra。

$ uv sync --extra foo

若要快速启用所有 extras,请使用 --all-extras 选项。

有关如何管理可选依赖项的详细信息,请参阅可选依赖项文档。

同步开发依赖

uv 从 [dependency-groups] 表(按照 PEP 735 定义)中读取开发依赖项。

dev 组比较特殊,默认会进行同步。有关更改默认设置的详细信息,请参阅默认组文档。

可以使用 --no-dev 标志来排除 dev 组。

可以使用 --only-dev 标志来仅安装 dev 组,而不安装项目及其依赖项。

可以使用 --all-groups--no-default-groups--group <name>--only-group <name>--no-group <name> 选项来包含或排除其他组。--only-group 的语义与 --only-dev 相同,即项目本身不会被包含。但是,--only-group 也会排除默认组。

组排除总是优先于包含,因此给定命令

$ uv sync --no-group foo --group foo

foo 组将不会被安装。

有关如何管理开发依赖项的详细信息,请参阅开发依赖项文档。

升级已锁定的包版本

如果已存在 uv.lock 文件,在运行 uv syncuv lock 时,uv 会优先使用之前锁定的包版本。只有当项目的依赖约束排除了先前锁定的版本时,包版本才会改变。

要升级所有包

$ uv lock --upgrade

要将单个包升级到最新版本,同时保留所有其他包的锁定版本

$ uv lock --upgrade-package <package>

要将单个包升级到特定版本

$ uv lock --upgrade-package <package>==<version>

在所有情况下,升级都受限于项目的依赖约束。例如,如果项目为某个包定义了上限,则升级不会超过该版本。

注意

uv 对 Git 依赖项应用了类似的逻辑。例如,如果 Git 依赖项引用了 main 分支,除非使用了 --upgrade--upgrade-package 标志,否则 uv 会优先使用现有 uv.lock 文件中锁定的提交 SHA,而不是 main 分支上的最新提交。

这些标志也可以传递给 uv syncuv run,以更新锁文件环境。

导出锁文件

如果您需要将 uv 与其他工具或工作流集成,可以将 uv.lock 导出为不同格式,包括 requirements.txtpylock.toml (PEP 751) 和 CycloneDX SBOM。

$ uv export --format requirements.txt
$ uv export --format pylock.toml
$ uv export --format cyclonedx1.5

有关所有导出格式及其用例的完整文档,请参阅导出指南

部分安装

有时分多步执行安装会很有帮助,例如在构建 Docker 镜像时为了获得最佳层缓存。uv sync 为此提供了几个标志。

  • --no-install-project:不安装当前项目
  • --no-install-workspace:不安装任何工作区成员,包括根项目
  • --no-install-package <NO_INSTALL_PACKAGE>:不安装指定的包

使用这些选项时,目标的所有依赖项仍会被安装。例如,--no-install-project 将省略项目本身,但不会省略其任何依赖项。

如果使用不当,这些标志可能导致环境损坏,因为包可能会丢失其依赖项。