依赖管理
依赖管理也是 uv 提供的主要功能,所以用于依赖管理的常用子命令都被独立了出来。依赖虽然在pyproject.toml
中以一个比较简单的方式定义,并且看起来可以比较方便的手工修改,但是这里还是建议使用 uv 提供的命令来修改项目的依赖。
添加依赖
向一个项目中添加依赖需要使用uv add
命令,这个命令最简单的使用方法就是直接指明所要使用的依赖库名称,例如uv add flask
。
或者还可是像requirements.txt
文件中定义以来的详细版本那样,声明依赖指定版本的库,例如uv add "httpx>=0.20"
。
uv add
命令可以接受 PEP 508 中定义的用于描述依赖库及其版本的字符串。同时还可以使用参数--dev
、--optional
和--group
分别将依赖添加到dev-dependencies
、optional-dependencies
等位置。
导入requirements.txt
比较老而且没有使用 uv 进行管理的项目,往往都是用requirements.txt
文件来管理项目中的依赖的。uv 也提供了将requirements.txt
中定义的项目依赖导入到 uv 的pyproject.toml
管理的功能。
要实现这个功能,只需要在项目目录下执行命令:
uv add -r requirements.txt
即可完成依赖项从requirements.txt
向pyproject.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.toml
中dependencies
部分声明的依赖的安装。要安装optional-dependencies
的安装,需要附加--extra
参数并指定所要安装的可选依赖组名称。dev-dependencies
下声明的依赖在默认状态下也是会被自动安装的,如果不需要安装这部分依赖,可以附加--no-dev
参数来使 uv 忽略dev-dependencies
的安装。
如果项目中存在一个uv.lock
文件,那么 uv 在执行sync
和lock
的时候会首先选择使用锁定文件中定义的包版本。只有在项目的依赖明显发生变化排除了当前锁定文件中记录的包版本的时候,才会修改并升级锁定文件的记录。如果的确有更新锁定文件的需要,可以通过手动执行uv lock --upgrade
来升级所有包的记录,或者使用uv lock --upgrade-package
来升级指定包的记录。