跳转至

uv 构建后端

Note

uv 构建后端目前处于预览阶段,可能会在无预警的情况下发生变动。

当未启用预览模式时,uv 使用 hatchling 作为默认的构建后端。

构建后端会将源树(即一个目录)转换为源发行版或 wheel 包。虽然 uv 支持所有构建后端(如 PEP 517 所规定),但它包含一个 uv_build 后端,该后端与 uv 紧密集成,以提升性能和用户体验。

uv 构建后端目前仅支持 Python 代码。如果你想创建一个带扩展模块的库,则需要使用其他后端。

要在现有项目中使用 uv 构建后端作为构建系统,请将其添加到 pyproject.toml 文件的 [build-system] 部分:

[build-system]
requires = ["uv_build>=0.7.4,<0.8.0"]
build-backend = "uv_build"

Important

uv 构建后端遵循相同的版本控制策略,为 uv_build 版本设置上限可确保该软件包在未来仍能正常构建。

你还可以使用 uv init 创建一个使用 uv 构建后端的新项目:

uv init --build-backend uv

uv_build 是与 uv 分离的软件包,针对可移植性和较小的二进制文件大小进行了优化。uv 命令包含构建后端的副本,因此在运行 uv build 时,构建后端将使用与 uv 进程相同的版本。其他构建前端,如 python -m build,将选择最新的兼容 uv_build 版本。

模块

默认的模块名是包名的小写形式,其中的点号和短横线会替换为下划线,默认的模块位置在 src 目录下,即构建后端期望在 src/<package_name>/__init__.py 找到模块。这些默认设置可以通过 module-namemodule-root 配置项进行更改。下面的示例期望在项目根目录下有一个 PIL/__init__.py 模块:

[tool.uv.build-backend]
module-name = "PIL"
module-root = ""

包含和排除配置

为了选择要包含在源发行版中的文件,uv 首先添加要包含的文件和目录,然后移除要排除的文件和目录。这意味着排除项始终优先于包含项。

在构建源发行版时,会包含以下文件和目录: - pyproject.toml - 默认情况下,tool.uv.build-backend.module-root 下的模块,即 src/<模块名或带下划线的项目名>/**。 - project.license-filesproject.readme。 - tool.uv.build-backend.data 下的所有目录。 - tool.uv.build-backend.source-include 中的所有模式。

从这些内容中,会移除 tool.uv.build-backend.source-exclude 以及默认排除项。

在构建 wheel 包时,会包含以下文件和目录: - 默认情况下,tool.uv.build-backend.module-root 下的模块,即 src/<模块名或带下划线的项目名>/**。 - project.license-filesproject.readme,作为项目元数据的一部分。 - tool.uv.build-backend.data 下的每个目录,作为数据目录。

从这些内容中,会移除 tool.uv.build-backend.source-excludetool.uv.build-backend.wheel-exclude 以及默认排除项。应用源发行版排除项是为了避免从源树到 wheel 源构建过程中包含比从源树到源发行版再到 wheel 构建更多的文件。

没有特定的 wheel 包含项。必须只有一个顶级模块,并且所有数据文件必须位于模块根目录下或相应的数据目录中。大多数包会将小数据与源代码一起存储在模块根目录中。

包含和排除语法

包含是基于项目根目录定位的,这意味着 pyproject.toml 仅包含 <项目根目录>/pyproject.toml。例如,assets/**/sample.csv 会包含 <项目根目录>/assets 或其任何子目录中的所有 sample.csv 文件。要递归包含某个目录下的所有文件,可使用 /** 后缀,例如 src/**

注意

为了性能和可重复性,应避免使用无定位的模式,如 **/sample.csv

排除不是基于项目根目录定位的,这意味着 __pycache__ 会排除任何位置名为 __pycache__ 的目录及其子目录。要基于项目根目录定位某个目录,可使用 / 前缀,例如,/dist 将仅排除 <项目根目录>/dist

所有接受模式的字段都使用 PEP 639 中简化的可移植通配符语法,此外,字符可以用反斜杠转义。