如何为poetry build命令添加自定义函数钩子
Poetry 自定义 build 钩子实现预生成子包的方案
Poetry 1.4 及以上版本原生支持自定义构建钩子能力,完全可以对标 Setuptools 的 build_py hook 实现构建前自动生成 DSDL 子包的需求,以下是两种适配不同场景的实现方案:
方案1:使用原生 build.py 构建脚本(单项目场景推荐)
无需额外安装插件,配置成本最低,是官方推荐的自定义构建实现方式。
- 首先修改项目根目录的
pyproject.toml配置:
[tool.poetry] # 保留原有配置不变,新增以下行指定自定义构建脚本路径 build = "build.py" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api"
- 在项目根目录新建
build.py文件,实现固定签名的build函数即可,你之前在 Setuptools 钩子中的 DSDL 生成逻辑可以直接迁移到该函数内:
from pyuavcan.dsdl import compile from pathlib import Path def build(setup_kwargs, package_dir): # package_dir 为项目源码根目录,如果你用src布局则对应src路径 target_output_dir = Path(package_dir) / "你的包名" / "generated_dsdl" target_output_dir.mkdir(exist_ok=True, parents=True) # 替换为你实际的DSDL编译参数 compile( source_paths=[Path("你的DSDL定义文件存放路径")], output_path=target_output_dir )
注意:如果不需要把生成的子包提交到Git仓库,把生成路径添加到
.gitignore即可,Poetry执行poetry build时会自动读取build.py执行后生成的所有文件,纳入最终的sdist/wheel包。
方案2:自定义构建插件(多项目复用场景适用)
如果你的构建逻辑需要在多个项目中复用,可以开发Poetry自定义构建插件,通过继承poetry.core.masonry.builders.Builder的方式扩展构建流程,单项目场景不推荐使用,配置成本更高。
验证方法
执行poetry build --verbose可以在日志中看到构建脚本的执行记录,构建完成后解压生成的.whl或.tar.gz包即可验证生成的子包是否已被正确纳入。
内容的提问来源于stack exchange,提问作者Finwood
相关产品推荐
相关产品推荐

