如何在Poetry的pyproject.toml中定义可选额外包(Extra)
如何在Poetry的pyproject.toml中定义可选额外包(Extra)
嗨,我正好用Poetry配置过一模一样的需求,这就给你一步步讲明白怎么实现!
第一步:先把基础的包结构配置好
首先,确保你的pyproject.toml里的[tool.poetry]部分能正确识别src目录下的整个my_package(包括core和gui子模块):
[tool.poetry] name = "my_package" version = "0.1.0" description = "核心功能 + 可选GUI扩展" authors = ["你的名字 <你的邮箱地址>"] # 告诉Poetry从src目录加载my_package这个包 packages = [{ include = "my_package", from = "src" }]
这里要说明下:默认安装my_package时,整个包的代码(core和gui的所有.py文件)都会被安装到用户环境里,但GUI功能需要的依赖不会装——这正是我们要的,因为GUI是可选功能,没装依赖的话用户用不了,会收到明确的错误提示。
第二步:配置核心功能的默认依赖
在[tool.poetry.dependencies]里写core功能必须的依赖,这些会在用户默认安装时自动装上:
[tool.poetry.dependencies] python = "^3.8" # 换成你的项目支持的Python版本 # 这里放core需要的依赖,比如: # requests = "^2.31.0" # numpy = "^1.25.0"
第三步:关键!定义GUI的可选Extra组
最后就是你最关心的部分——在pyproject.toml里添加[tool.poetry.extras]区块,把GUI需要的额外依赖都归到gui这个组里:
[tool.poetry.extras] gui = [ "PyQt6>=6.5.0", # 举个例子,GUI需要的UI库 "matplotlib>=3.7.0" # 假设GUI需要绘图功能的依赖 ]
这样配置完之后:
- 用户运行
poetry add my_package:只会安装my_package的核心代码 + core的依赖,GUI的代码虽然在包里,但因为缺少依赖,无法正常使用; - 用户运行
poetry add my_package[gui]:会自动安装核心代码 + core依赖 + GUI需要的所有额外依赖,用户就能直接用core和GUI的全部功能了。
补充:如果真的想默认不包含GUI代码(不推荐)
如果你铁了心要让默认安装时完全看不到GUI的代码,其实可以把core和GUI拆成两个独立的子包,但这不符合Python包的常规发布逻辑,会让用户困惑“为什么同一个包名,装了[gui]才会有gui模块”。通常我们还是推荐把所有代码都包含在包里,用extras控制依赖——毕竟用户即使误导入gui模块,也会收到清晰的错误提示,知道需要安装my_package[gui]。
备注:内容来源于stack exchange,提问作者frimann
相关产品推荐
相关产品推荐

