如何使用uv更新项目依赖
使用uv 管理的python项目,开发了一段时间以后,有很多第三方的依赖有更新了,这时需要更新一下,本文介绍一下如何使用uv 来更新项目依赖。
先安装几个包的老版本
| uv add "fastapi==0.114.2"
uv add "httpx<=0.28.0"
|
此时 pyproject.toml 中的配置信息为
| [project]
name = "version-demo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"fastapi==0.114.2",
"httpx<=0.28.0",
]
[[tool.uv.index]]
url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
|
在 uv.lock 中记录了当前环境下包的版本,可以理解为pyproject.toml 中配置的是范围,而 uv.lock 中是包具体的版本。
| [[package]]
name = "fastapi"
version = "0.114.2"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" }
dependencies = [
{ name = "pydantic" },
{ name = "starlette" },
{ name = "typing-extensions" },
]
....
[[package]]
name = "httpx"
version = "0.28.0"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" }
dependencies = [
{ name = "anyio" },
{ name = "certifi" },
{ name = "httpcore" },
{ name = "idna" },
]
....
|
过了一段时间,httpx 发布了 0.28.1, 我想升级一下本地的依赖
| uv add httpx
Resolved 15 packages in 2ms
Audited 14 packages in 0.02ms
|
直接运行 uv add httpx
并不会升级httpx, 它会检查一下项目中的pyproject.toml, 这里有httpx 的配置
| dependencies = [
"fastapi==0.114.2",
"httpx<=0.28.0",
]
|
并且 uv.lock 中的httpx 的版本是 0.28.0
, 符合这里的配置,所以就不再更新下载。
直接升级到指定版本
这时pyproject.toml 变为
| dependencies = [
"fastapi==0.114.2",
"httpx==0.28.1",
]
|
uv.lock 也被修改了
| [[package]]
name = "httpx"
version = "0.28.1"
source = { registry = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" }
dependencies = [
{ name = "anyio" },
{ name = "certifi" },
{ name = "httpcore" },
{ name = "idna" },
]
|
成功升级到了 0.28.1
降级到指定版本
有时发现新版本有问题,需要降级, 也是直接使用 uv add 命令指定版本
自动升级到符合条件的最新版
假如项目中pyproject.toml 有如下的配置信息
| [project]
name = "version-demo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"fastapi>=0.114.2",
"httpx>=0.27.0",
"requests>=2.32.2",
]
|
这里和上面的区别在于,包版本是范围配置,如 httpx>=0.27.0
, fastapi>=0.114.2
, 这是因为当使用 uv add httpx
安装 httpx 时,如果当时最新版是 0.27.0
, 那么在 pyproject.toml 中会记录为 httpx>=0.27.0
, 这也是为了之后的升级,如果像上一节那样使用 uv add httpx==0.27.0
, 相当于将版本限制在了 0.27.0 了,之后不好升级了。
经过一段时间以后,httpx 已经升级到了 0.28.1, 现在我想单独升级 httpx 到最新版, 则可以使用 uv sync --upgrade-package httpx
来更新
| uv sync --upgrade-package httpx
Resolved 18 packages in 204ms
Prepared 1 package in 20ms
Uninstalled 1 package in 18ms
Installed 1 package in 34ms
- httpx==0.27.0
+ httpx==0.28.1
|
上面输出显示 卸载了httpx 的 0.27.0 版本,添加了httpx 的 0.28.1 版本。
如果别的包也有更新,如 requests 已经更新到了2.32.3了,可以使用
| uv sync --upgrade-package requests
|
如果将所有包统一升级则可以使用 uv sync --upgrade
命令升级所有的包。
注意
是否需要升级取决于 pyproject.toml 中的配置和pypi 中是否有更新
如 pyproject.toml 中配置为
| dependencies = [
"fastapi>=0.114.2",
"httpx==0.27.0",
"requests==2.32.2",
]
|
这里已经将httpx 的版本固定在了 0.27.0, 那么即使pypi 中有更新的版本,当使用 uv sync --upgrade-package httpx
也不会更新, 所以这个也就是为什么使用 uv add 包时默认配置是 >=
而不是 `==。
总结
- 使用uv 更新项目中某个包,如果想要更新到指定版本,可以使用
uv add "httpx==0.27.0"
- 如果要更新指定包到pypi 中最新版本,使用
uv sync --upgrade-package httpx
- 使用
uv sync
进行更新的前提是 pyproject.toml 中的版本号不是特定版本==
,应该是一个范围的: >=
- 使用
uv sync --upgrade
更新项目下所有的包