Python多子项目打包:如何在顶层目录构建生成各子项目包文件
解决方案
你的需求是典型的**单仓库多项目(Monorepo)**打包场景,当前配置的问题在于顶层pyproject.toml被Hatch识别为一个独立的打包项目,导致它把proj1和proj2合并成了名为projs的单包输出。通过调整Hatch的Monorepo配置可以实现你的需求,具体步骤如下:
1. 修正顶层pyproject.toml
移除顶层文件中用于打包的[project]和[tool.hatch.build.targets]块,改为配置Hatch的Monorepo管理规则,同时保留格式化工具的配置:
# 顶层pyproject.toml:仅用于格式化等工具配置 [tool.black] line-length = 120 [tool.ruff] line-length = 120 # Hatch Monorepo 核心配置:管理子项目 [tool.hatch.monorepo] projects = [ "proj1", "proj2" ] # 全局构建配置:指定所有子项目的产物输出到顶层dist目录 [tool.hatch.build] target-dir = "../dist"
2. 保留子项目的pyproject.toml配置
子项目的配置无需大幅修改,确保每个子项目的[project]块正确定义自身的包信息即可,比如proj1的配置保持原样:
[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "proj1" license = "AGPL-3.0-or-later" [tool.hatch.version] path = "proj1/__init__.py" [tool.hatch.build.targets.sdist] include = [ "/proj1", ]
3. 执行批量构建
在顶层目录运行以下命令,即可同时构建所有子项目,并将.whl和.tar.gz产物统一输出到顶层dist/目录:
hatch build --all
如果需要单独构建某个子项目,可指定项目名称:
hatch build -r proj1
问题原因说明
之前的顶层配置中,你定义了[project]块并指定了packages=["proj1", "proj2"],Hatch会将这两个目录视为同一个包的子模块,因此生成了名为projs的合并包,路径结构自然出现冗余。改为Monorepo模式后,Hatch会将每个子目录视为独立的打包项目,分别处理它们的构建逻辑,最终输出各自的独立包产物。
内容的提问来源于stack exchange,提问作者JCWasmx86
相关产品推荐
相关产品推荐

