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/**。
Tip
为了性能和可重复性,应避免使用无定位的模式,如 **/sample.csv。
排除不是基于项目根目录定位的,这意味着 __pycache__ 会排除任何位置名为 __pycache__ 的目录及其子目录。要基于项目根目录定位某个目录,可使用 / 前缀,例如,/dist 将仅排除 <项目根目录>/dist。
所有接受模式的字段都使用 PEP 639 中简化的可移植通配符语法,此外,字符可以用反斜杠转义。