如何在pyproject.toml中配置动态可选依赖,实现默认全量安装、指定分组仅装对应子模块依赖
如何在pyproject.toml中配置动态可选依赖,实现默认全量安装、指定分组仅装对应子模块依赖
我明白你现在卡在哪了——原来的配置里,你把两个模块的依赖都塞进主依赖组dependencies里了,pip的逻辑是不管你指定哪个可选依赖组,主依赖都会被强制安装,所以哪怕你只想要module1的依赖,module2的也会被顺带装上来,完全不是你想要的效果。
问题的核心根源在于:pip的运行逻辑是无论你指定哪个可选依赖组,主依赖dependencies中的内容都会被强制安装。你之前把两个模块的依赖都塞到主依赖里,自然会出现“选了module1却也装了module2”的问题。
要实现你要的效果,我们得调整配置逻辑,具体方案如下:
requires = ["setuptools", "setuptools-scm"] build-backend = "setuptools.build_meta" [project] requires-python = ">=3.9" name = "foobar" dynamic = ["optional-dependencies"] # 主依赖留空,不再包含任何模块的业务依赖 dependencies = [] [tool.setuptools.dynamic] # 单独的module1依赖组,仅引用自身的需求文件 optional-dependencies.module1 = { file = ["module1/module1_requirements.txt"] } # 单独的module2依赖组,仅引用自身的需求文件 optional-dependencies.module2 = { file = ["module2/module2_requirements.txt"] } # 全量依赖组,包含两个模块的所有依赖 optional-dependencies.all = { file = ["module1/module1_requirements.txt", "module2/module2_requirements.txt"] } # 关键配置:让默认安装(不指定任何extras时)自动安装all组 [tool.setuptools] default-extras = ["all"]
这个配置的运行效果完全匹配你的需求:
- 运行
pip install .时,因为default-extras指定了all组,pip会自动安装全量依赖(module1+module2的需求都拉取),实现默认全量安装的效果。 - 运行
pip install .[module1]时,pip只会安装module1组对应的依赖,不会触发全量组,也不会安装module2的依赖,完美满足“指定分组仅装对应子模块依赖”的要求。
最后提个小注意点:这个方案需要你的setuptools版本在61.0.0及以上,因为default-extras这个配置项是从这个版本开始支持的,如果你的setuptools版本太低,记得先升级一下。
备注:内容来源于stack exchange,提问作者user1234352
相关产品推荐
相关产品推荐

