跳转到内容

锁定与同步

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

自动锁定与同步

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

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

$ uv run --locked ...

如果lockfile不是最新的,uv将抛出错误而不是更新lockfile。

要使用锁文件而不检查其是否为最新版本,请使用 --frozen 选项:

$ uv run --frozen ...

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

$ uv run --no-sync ...

检查锁文件是否为最新版本

在判断锁文件是否最新时,uv会检查其是否与项目元数据匹配。 例如,如果您向pyproject.toml添加依赖项,锁文件将被视为 已过期。同样,如果您修改依赖项的版本约束导致锁定版本 被排除在外,锁文件也会被视为过期。但如果修改版本约束后 现有锁定版本仍被包含在内,锁文件仍会被视为 最新状态。

您可以通过向uv lock传递--check标志来检查lockfile是否为最新版本:

$ uv lock --check

这相当于其他命令中的--locked标志。

重要

uv不会在软件包发布新版本时认为锁文件已过期——如果您想升级依赖项,需要明确更新锁文件。详情请参阅升级锁定包版本的文档。

创建锁文件

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

$ uv lock

同步环境

虽然环境会自动同步,但也可以显式地使用uv sync进行同步:

$ uv sync

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

可编辑安装

当环境同步完成后,uv将以可编辑模式安装项目(及其他工作区成员),这样在环境中对代码的修改无需重新同步即可生效。

要退出此行为,请使用 --no-editable 选项。

注意

如果项目未定义构建系统,则不会安装。 详情请参阅build systems文档。

保留无关包

默认情况下,同步是"精确"的,这意味着它会移除锁文件中不存在的任何包。

要保留无关的包,请使用 --inexact 选项:

$ uv sync --inexact

同步可选依赖项

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

uv默认不会同步额外依赖项。使用--extra选项可以包含额外依赖。

$ uv sync --extra foo

要快速启用所有额外功能,请使用 --all-extras 选项。

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

同步开发依赖项

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

dev 组是特殊处理的,默认情况下会同步。有关更改默认设置的详细信息,请参阅默认组文档。

--no-dev 标志可用于排除 dev 组。

--only-dev 标志可用于仅安装 dev 组,而包含项目及其依赖项。

可以通过--all-groups--no-default-groups--group --only-group --no-group 选项来包含或排除其他组。--only-group的语义与--only-dev相同,项目不会被包含在内。但是,--only-group还会排除默认组。

分组排除规则始终优先于包含规则,因此给定命令:

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

foo 组将不会被安装。

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

升级锁定包版本

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

升级所有软件包:

$ uv lock --upgrade

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

$ uv lock --upgrade-package <package>

将单个软件包升级到特定版本:

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

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

注意

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

这些标志也可以提供给uv syncuv run来更新锁文件环境。

导出lockfile文件

如果需要将uv与其他工具或工作流集成,您可以使用uv export --format requirements-txt命令将uv.lock导出为requirements.txt格式。生成的requirements.txt文件可以通过uv pip install安装,或者使用其他工具如pip进行安装。

通常,我们不建议同时使用uv.lockrequirements.txt文件。如果您发现自己需要导出uv.lock文件,建议提交issue讨论您的使用场景。

部分安装

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

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

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

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