跳转至

如何使用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, 我想升级一下本地的依赖

1
2
3
uv add httpx
Resolved 15 packages in 2ms
Audited 14 packages in 0.02ms

直接运行 uv add httpx 并不会升级httpx, 它会检查一下项目中的pyproject.toml, 这里有httpx 的配置

1
2
3
4
dependencies = [
    "fastapi==0.114.2",
    "httpx<=0.28.0",
]

并且 uv.lock 中的httpx 的版本是 0.28.0, 符合这里的配置,所以就不再更新下载。

直接升级到指定版本

uv add "httpx==0.28.1"

这时pyproject.toml 变为

1
2
3
4
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 命令指定版本

uv add "httpx==0.27.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.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 来更新

1
2
3
4
5
6
7
8
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 中配置为

1
2
3
4
5
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 包时默认配置是 >= 而不是 `==。

总结

  1. 使用uv 更新项目中某个包,如果想要更新到指定版本,可以使用 uv add "httpx==0.27.0"
  2. 如果要更新指定包到pypi 中最新版本,使用 uv sync --upgrade-package httpx
  3. 使用 uv sync 进行更新的前提是 pyproject.toml 中的版本号不是特定版本== ,应该是一个范围的: >=
  4. 使用 uv sync --upgrade 更新项目下所有的包