如何在一个有多个包的pypi项目中选择性地安装包?

How to selective install package in one pypi project which has multiple packages?

我有下一个文件夹结构:

.
├── demo
│   └── __init__.py
├── demo2
│   └── __init__.py
└── setup.py

demo/__init__.py:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
def test():
    print("demo1!")
if __name__ == '__main__':
    test()

demo2/__init__.py:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
def test():
    print("demo2!")
if __name__ == '__main__':
    test()

setup.py:

from setuptools import setup, find_packages

setup(
    name="demo20210216",
    version="0.1.0",
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'demo = demo:test',
            'demo2 = demo2:test',
        ]
    }
)

我用next上传到pypi:

# python setup.py sdist bdist_wheel
# twine upload dist/*

然后我可以使用 pip install demo20210216 安装包,并且可以验证我安装了两个包 demo & demo2,同时脚本 demo & demo2 安装在脚本文件夹中。

问题:

一切都很好,只是为了demo2,我的大多数观众不需要它。 所以,我想找到一种方法:默认只安装 demo1,但如果用户需要,he/she 可以使用其他方式安装 demo2,有没有办法在 pip 中实现它?

(PS: 我不想将 demo1demo2 分开到不同的 pypi 项目)

最后没找到解决办法,直接用评论里的解决办法:就是用一个wrapper project depends on other projects (demo1, demo2):

setup.py:

from setuptools import setup, find_packages

setup(
    name="demowrapper",
    version="0.1.0",
    packages=find_packages(),

    extras_require={
        'demo1': ['demo1'],
        'demo2': ['demo2'],
    },
)

然后,至少,对于用户来说,它看起来仍然可以面向一个顶级项目 demowrapper,并且可以 select 组件来安装 pip install demowrapper[demo1]