如何通过pyproject.toml从单个Python仓库构建多发行版包?
单仓库多发行包的pyproject.toml实现方案
完全可以用pyproject.toml实现单仓库输出多种发行包,下面提供两种实用方案:
方案一:基于Setuptools的条件打包(无额外工具依赖)
利用Setuptools的动态配置和环境变量控制打包内容,步骤如下:
- 编写pyproject.toml配置:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] version = "0.0.1" dynamic = ["name", "packages"] [tool.setuptools.dynamic] name = {file = "package_name.txt"} packages = {file = "packages_list.txt"}
- 编写打包控制脚本(比如
prepare_build.py):
import os # 根据环境变量决定打包类型 build_type = os.environ.get("BUILD_TYPE", "full") if build_type == "c-only": # 仅打包c包 with open("package_name.txt", "w") as f: f.write("project_c_only") with open("packages_list.txt", "w") as f: f.write("c\n") else: # 打包全量a+b+c with open("package_name.txt", "w") as f: f.write("project_a+b+c") with open("packages_list.txt", "w") as f: f.write("a\n") f.write("b\n") f.write("c\n")
- 执行打包命令:
- 打包全量包:
python prepare_build.py && python -m build - 打包仅c的包:
BUILD_TYPE=c-only python prepare_build.py && python -m build
执行后会在dist目录生成对应名称的包文件。
方案二:基于Hatch的多项目配置(更简洁)
Hatch是现代Python打包工具,原生支持单仓库多项目配置,无需额外脚本:
- 编写pyproject.toml配置:
[build-system] requires = ["hatchling"] build-backend = "hatchling.build" # 全量包配置 [project] name = "project_a+b+c" version = "0.0.1" packages = ["a", "b", "c"] package-dir = {"": "src"} # 仅c的包配置 [tool.hatch.projects.project_c_only] name = "project_c_only" version = "0.0.1" packages = ["c"] package-dir = {"": "src"}
- 执行打包命令:
- 打包全量包:
hatch build - 打包仅c的包:
hatch build -p project_c_only
Hatch会自动在dist目录生成两个不同的包,无需手动修改配置或重命名文件。
注意事项
- 方案一依赖Setuptools,适合传统项目,无需额外安装工具;
- 方案二依赖Hatch,需要先通过
pip install hatch安装,配置更简洁,适合现代Python项目; - 两种方案都能保证从同一源码仓库输出不同内容的发行包,满足内部/外部使用的区分需求。
内容的提问来源于stack exchange,提问作者jjkparker
相关产品推荐
相关产品推荐

