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

问题描述

我有一个文件夹结构:

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

演示/__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 来安装包,并且可以验证我安装了两个包 demodemo2,同时脚本 demodemo2安装在 Scripts 文件夹中。

问题:

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

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

解决方法

最后,没有找到更多的解决方案,只使用评论中的解决方案:即使用一个包装项目依赖于其他项目(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,并且可以选择要安装的组件pip install demowrapper[demo1]