如何用hatch让项目脚本仅随指定可选特性安装?
问题解答
1. 能否将entry point绑定到optional feature安装?
目前Python标准打包规范(PEP 621)不支持直接将[project.scripts]定义的entry point与optional dependency(feature)关联绑定。也就是说,只要你的包被安装,无论是否勾选gui特性,tsdb-demo脚本都会被创建。
2. 推荐解决方案
方案一:运行时依赖检查(最简单,无需拆分)
修改tsdb.scripts.run_streamlit:run函数,在启动时先检查Streamlit是否安装,未安装则给出明确指引:
def run(): try: import streamlit except ImportError: print("错误:运行Demo需要安装tsdb的gui特性,请执行:") print("pip install tsdb[gui]") exit(1) # 原Streamlit启动逻辑 streamlit.run(...)
这种方式成本最低,用户误运行脚本时能得到清晰提示,不会出现模糊的依赖报错。
方案二:将Demo拆分为独立包(长期规范方案)
如果Demo功能后续会扩展,或希望完全隔离依赖,建议将其拆分为独立包(比如命名为tsdb-demo),可放在同一个Git仓库(即monorepo结构),用Hatch的多包管理功能维护:
- 仓库根目录创建两个子目录:
tsdb(核心包)和tsdb-demo(Demo包) - 为
tsdb-demo单独编写pyproject.toml,声明依赖tsdb和streamlit - 用
hatch build --all可一次性构建两个包,或单独构建某一个
这种方式的优势:
- 核心包与Demo依赖完全隔离,用户安装核心包时不会被强制引入Streamlit
- Demo包可独立发布、更新,不影响核心包的版本节奏
- 同一仓库维护,无需切换仓库,便于代码同步和协作
3. 关于仓库选择
拆分后完全可以放在同一个Git仓库,这是Python社区常见的monorepo实践,Hatch、Poetry等工具都支持多包仓库管理。如果后续Demo与核心包迭代节奏差异极大,再考虑拆分到独立仓库也不迟。
内容的提问来源于stack exchange,提问作者Michal Kaut
相关产品推荐
相关产品推荐

