You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:37:10