uv 构建后端
构建后端会将源树(即一个目录)转换为源发行版或 wheel 包。虽然 uv 支持所有构建后端(如 PEP 517 所规定),但它包含一个 uv_build
后端,该后端与 uv 紧密集成,以提升性能和用户体验。
uv 构建后端目前仅支持 Python 代码。如果你想创建一个带扩展模块的库,则需要使用其他后端。
要在现有项目中使用 uv 构建后端作为构建系统,请将其添加到 pyproject.toml
文件的 [build-system]
部分:
Important
uv 构建后端遵循相同的版本控制策略,为 uv_build
版本设置上限可确保该软件包在未来仍能正常构建。
你还可以使用 uv init
创建一个使用 uv 构建后端的新项目:
uv_build
是与 uv 分离的软件包,针对可移植性和较小的二进制文件大小进行了优化。uv
命令包含构建后端的副本,因此在运行 uv build
时,构建后端将使用与 uv 进程相同的版本。其他构建前端,如 python -m build
,将选择最新的兼容 uv_build
版本。
模块
默认的模块名是包名的小写形式,其中的点号和短横线会替换为下划线,默认的模块位置在 src
目录下,即构建后端期望在 src/<package_name>/__init__.py
找到模块。这些默认设置可以通过 module-name
和 module-root
配置项进行更改。下面的示例期望在项目根目录下有一个 PIL/__init__.py
模块:
包含和排除配置
为了选择要包含在源发行版中的文件,uv 首先添加要包含的文件和目录,然后移除要排除的文件和目录。这意味着排除项始终优先于包含项。
在构建源发行版时,会包含以下文件和目录:
- pyproject.toml
- 默认情况下,tool.uv.build-backend.module-root
下的模块,即 src/<模块名或带下划线的项目名>/**
。
- project.license-files
和 project.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-files
和 project.readme
,作为项目元数据的一部分。
- tool.uv.build-backend.data
下的每个目录,作为数据目录。
从这些内容中,会移除 tool.uv.build-backend.source-exclude
、tool.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 中简化的可移植通配符语法,此外,字符可以用反斜杠转义。