锁定与同步
锁定是将项目依赖项解析到lockfile中的过程。同步是从项目环境的lockfile中安装部分软件包的过程。
自动锁定与同步
在uv中,锁定和同步是自动的。例如,当使用uv run时,会在调用请求的命令之前锁定和同步项目。这确保了项目环境始终是最新的。同样,读取锁定文件的命令,如uv tree,也会在运行前自动更新它。
要禁用自动锁定,请使用 --locked 选项:
如果lockfile不是最新的,uv将抛出错误而不是更新lockfile。
要使用锁文件而不检查其是否为最新版本,请使用 --frozen 选项:
同样地,要在不检查环境是否为最新状态的情况下运行命令,请使用 --no-sync 选项:
检查锁文件是否为最新版本
在判断锁文件是否最新时,uv会检查其是否与项目元数据匹配。
例如,如果您向pyproject.toml添加依赖项,锁文件将被视为
已过期。同样,如果您修改依赖项的版本约束导致锁定版本
被排除在外,锁文件也会被视为过期。但如果修改版本约束后
现有锁定版本仍被包含在内,锁文件仍会被视为
最新状态。
您可以通过向uv lock传递--check标志来检查lockfile是否为最新版本:
这相当于其他命令中的--locked标志。
重要
uv不会在软件包发布新版本时认为锁文件已过期——如果您想升级依赖项,需要明确更新锁文件。详情请参阅升级锁定包版本的文档。
创建锁文件
虽然锁文件是自动创建的,但也可以使用uv lock显式创建或更新锁文件:
同步环境
虽然环境会自动同步,但也可以显式地使用uv sync进行同步:
手动同步环境对于确保编辑器拥有正确版本的依赖项特别有用。
可编辑安装
当环境同步完成后,uv将以可编辑模式安装项目(及其他工作区成员),这样在环境中对代码的修改无需重新同步即可生效。
要退出此行为,请使用 --no-editable 选项。
注意
如果项目未定义构建系统,则不会安装。 详情请参阅build systems文档。
保留无关包
默认情况下,同步是"精确"的,这意味着它会移除锁文件中不存在的任何包。
要保留无关的包,请使用 --inexact 选项:
同步可选依赖项
uv 从 [project.optional-dependencies] 表中读取可选依赖项。这些通常被称为"extras"。
uv默认不会同步额外依赖项。使用--extra选项可以包含额外依赖。
要快速启用所有额外功能,请使用 --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还会排除默认组。
分组排除规则始终优先于包含规则,因此给定命令:
foo 组将不会被安装。
有关如何管理开发依赖项的详细信息,请参阅开发依赖项文档。
升级锁定包版本
当存在uv.lock文件时,uv在运行uv sync和uv lock时会优先使用之前锁定的包版本。只有当项目的依赖约束排除了之前锁定的版本时,包版本才会发生变化。
升级所有软件包:
要将单个软件包升级到最新版本,同时保留所有其他软件包的锁定版本:
将单个软件包升级到特定版本:
在所有情况下,升级都受限于项目的依赖约束。例如,如果项目为某个包定义了版本上限,那么升级将不会超过该版本。
注意
uv对Git依赖项应用了类似的逻辑。例如,如果Git依赖项引用了main分支,uv会优先使用现有uv.lock文件中锁定的提交SHA,而不是main分支上的最新提交,除非使用了--upgrade或--upgrade-package标志。
这些标志也可以提供给uv sync或uv run来更新锁文件和环境。
导出lockfile文件
如果需要将uv与其他工具或工作流集成,您可以使用uv export --format requirements-txt命令将uv.lock导出为requirements.txt格式。生成的requirements.txt文件可以通过uv pip install安装,或者使用其他工具如pip进行安装。
通常,我们不建议同时使用uv.lock和requirements.txt文件。如果您发现自己需要导出uv.lock文件,建议提交issue讨论您的使用场景。
部分安装
有时分步执行安装很有帮助,例如在构建Docker镜像时实现最佳层缓存。uv sync为此提供了多个标志参数。
--no-install-project: 不安装当前项目--no-install-workspace: 不安装任何工作区成员,包括根项目--no-install-package: 不安装指定的包
当使用这些选项时,目标的所有依赖项仍会被安装。例如,--no-install-project会忽略项目本身,但不会忽略其任何依赖项。
如果使用不当,这些标志可能导致环境损坏,因为某个包可能会缺失其依赖项。