依赖管理

依赖管理也是 uv 提供的主要功能,所以用于依赖管理的常用子命令都被独立了出来。依赖虽然在pyproject.toml中以一个比较简单的方式定义,并且看起来可以比较方便的手工修改,但是这里还是建议使用 uv 提供的命令来修改项目的依赖。

添加依赖

向一个项目中添加依赖需要使用uv add命令,这个命令最简单的使用方法就是直接指明所要使用的依赖库名称,例如uv add flask

或者还可是像requirements.txt文件中定义以来的详细版本那样,声明依赖指定版本的库,例如uv add "httpx>=0.20"

uv add命令可以接受 PEP 508 中定义的用于描述依赖库及其版本的字符串。同时还可以使用参数--dev--optional--group分别将依赖添加到dev-dependenciesoptional-dependencies等位置。

Caution

如果向项目中添加已经存在但版本不同的依赖,那么原有的依赖将被替换。

导入requirements.txt

比较老而且没有使用 uv 进行管理的项目,往往都是用requirements.txt文件来管理项目中的依赖的。uv 也提供了将requirements.txt中定义的项目依赖导入到 uv 的pyproject.toml管理的功能。

要实现这个功能,只需要在项目目录下执行命令:

uv add -r requirements.txt

即可完成依赖项从requirements.txtpyproject.toml导入的操作。

移除依赖

与添加依赖相对的常用操作就是移除依赖了,而且 uv 的命令也是跟添加依赖相对的。从项目中移除依赖只需要使用uv remove命令,这个命令在使用的时候只需要指定所需要移除的依赖项的名字即可。

同时uv remove命令也支持使用--dev--optional--group参数来分别操作对应的依赖定义项目。

锁定与同步

对于项目运行所需要的环境,uv 是通过锁定文件(uv.lock)来控制的。锁定就是将项目的依赖记录到锁定文件的过程,锁定文件中会记录项目依赖的具体名称和所需要安装的版本。而同步则是根据锁定文件中的记录在项目环境中安装一部分包的过程。

在 uv 中,锁定和同步通常都是自动完成的,当执行uv run命令时,项目会被自动锁定并完成同步,然后再执行相应的命令活脚本。除了uv run命令以外,其他的一些与依赖相关的命令也会自动完成锁定和同步操作,例如uv tree

如果在运行的时候不需要自动锁定功能,可以为uv run附加参数--locked,但是此时如果锁定文件内容不是最新的,那么 uv 会报错。所以如果要坚持使用当前的锁定文件,那么可以附加参数--frozen,这会让 uv 跳过锁定文件的检查。同样地,如果不需要 uv 检查并更新项目环境,那么就需要使用参数--no-sync

既然可以关闭 uv 对锁定文件的检查,那么自然也就可以手动执行对锁定文件的检查,要完成这个操作需要使用uv lock --check命令。在这个命令中,uv lock子命令的主要功能是用来创建或者更新锁定文件,参数--check的功能是指示 uv 完成锁定文件的检查。

手动完成项目环境的同步则需要使用uv sync命令。默认状态下,uv sync会自动检查项目环境并完成pyproject.tomldependencies部分声明的依赖的安装。要安装optional-dependencies的安装,需要附加--extra参数并指定所要安装的可选依赖组名称。dev-dependencies下声明的依赖在默认状态下也是会被自动安装的,如果不需要安装这部分依赖,可以附加--no-dev参数来使 uv 忽略dev-dependencies的安装。

如果项目中存在一个uv.lock文件,那么 uv 在执行synclock的时候会首先选择使用锁定文件中定义的包版本。只有在项目的依赖明显发生变化排除了当前锁定文件中记录的包版本的时候,才会修改并升级锁定文件的记录。如果的确有更新锁定文件的需要,可以通过手动执行uv lock --upgrade来升级所有包的记录,或者使用uv lock --upgrade-package来升级指定包的记录。

Tip

如果要指定某个包的版本,可以使用uv lock --upgrade-package <package>==<version>的命令。这种操作十分常见,你可以在--upgrade-pakcage参数中使用任何 PEP 508 中规定的用来描述依赖的字符串。