如何用Hatch从同一源码构建两个不同的Python包?
解决Hatch多构建目标生成不同Whl包的问题
核心问题点
你之前的配置没给两个构建目标设置不同的包名,且排除规则的配置逻辑未生效,导致Hatch只是把同一个包放到不同目录,没有真正过滤代码。
具体解决步骤
1. 明确项目结构
假设你的CLI代码集中在my_project/cli/目录下,项目结构如下:
my_project/ ├── src/ │ └── my_project/ │ ├── __init__.py │ ├── core/ # 核心API代码 │ └── cli/ # CLI相关代码 └── pyproject.toml
2. 修改pyproject.toml配置
直接在配置文件中给两个构建目标分别指定包名和过滤规则:
[project] name = "my_project" version = "1.2.3" # 填写你的基础配置,比如作者、依赖等... [tool.hatch.build] sources = ["src"] # 声明源码目录,确保Hatch能正确识别位置 [tool.hatch.build.targets.wheel] # 默认构建完整CLI包 exclude = [] [tool.hatch.build.targets.wheel.api] # API子集包的专属配置 name = "my_project_api" # 必须设置不同包名,避免产物冲突 exclude = ["my_project/cli/**/*"] # 排除所有CLI相关代码 # 若需更精准控制,也可以用include指定仅打包API代码:include = ["my_project/core/**/*", "my_project/__init__.py"]
3. 执行构建命令
现在运行对应命令即可生成目标包:
- 构建完整CLI包:
hatch build -t wheel:default - 构建API子集包:
hatch build -t wheel:api - 一次性构建两个包:
hatch build
执行完成后,dist目录会生成你需要的两个不同whl文件:
my_project-1.2.3-py3-none-any.whl(包含CLI代码)my_project_api-1.2.3-py3-none-any.whl(不含CLI代码)
关键注意事项
- 每个构建目标的
name必须唯一,否则Hatch会覆盖同名产物 - 排除/包含规则的路径是相对于
src目录下的包路径,确保路径匹配正确 - 若项目非
src布局,需调整sources配置或路径规则
内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig
相关产品推荐
相关产品推荐

