Python:一个存储库中有多个软件包,或者每个存储库中一个软件包?

时间:2019-01-19 10:00:26

标签: python python-3.x github setuptools python-packaging

我有一个庞大的Python 3.7+项目,目前正在将其拆分为多个可单独安装的软件包。我最初的想法是拥有一个包含多个软件包的Git存储库,每个软件包都有自己的setup.py。但是,在Google上进行一些研究时,我发现有人建议每个软件包使用一个存储库:(例如Python - setuptools - working on two dependent packages (in a single repo?))。但是,没有人提供为什么他们喜欢这种结构的很好的解释。

所以,我的问题是:

  • 在同一个GitHub存储库上具有多个软件包(每个软件包都有自己的setup.py)的含义是什么?
  • 我要面对这样的设置问题吗?
  • 常见的Python工具(文档生成器,pypi打包等)是否与这种设置兼容?
  • 有充分的理由选择一种设置而不是另一种设置吗?
  • 请记住,这不是基于意见的问题。我想知道两种方法中的任何一种是否存在技术问题或问题。

此外,我知道(如果我错了,请纠正我)setuptools现在允许从GitHub存储库安装依赖项,即使setup.py的GitHub URL不在存储库的根目录。

3 个答案:

答案 0 :(得分:1)

这里涵盖了一个方面 https://pip.readthedocs.io/en/stable/reference/pip_install/#vcs-support

特别是,如果setup.py不在根目录中,则必须在pip install命令中指定用于查找setup.py的子目录。

  

因此,如果您的存储库布局为:

     
      
  • pkg_dir /      
        
    • setup.py#软件包pkg的setup.py
    •   
    • some_module.py
    •   
  •   
  • other_dir /      
        
    • some_file
    •   
    • some_other_file
    •   
  •   
     

您需要使用pip install -e vcs + protocol:// repo_url /#egg = pkg&subdirectory = pkg_dir。

答案 1 :(得分:1)

“最佳”方法?这是一个见解,不是SO的范畴。但是,有两个创建单独的程序包的理由:

  1. 程序包在功能上独立于项目中的其他程序包。
    也就是说,不会从它们中导入并执行对其他开发人员可能有用的功能。如果此包执行的功能与PyPI中已存在的包类似,则需要加分。 如果程序包具有稳定的API和清晰的文档,则需要加分。如果程序包是不相关功能的瘦包,您会从多个程序包中剔除以方便维护,则要加分,但是这些功能没有统一的原则。
  2. 该软件包对于您的主项目是可选的,因此在某些情况下,用户可以合理地选择跳过安装。
    也许一个包是“客户端”,而另一个包是“服务器”。或者该软件包提供了特定于OS的功能。 请注意,这样的程序包不是在功能上独立于主项目,因此不符合先前的要点,但这仍然是分隔它的一个很好的理由。

我同意@boriska的观点,即“单一包”项目结构是值得努力争取的维护方便性。但是,不是(这只是我的观点,我会因为表达这一观点而感到不满),以牺牲大量从未安装过的小型软件包来包装公共软件包索引为代价。

答案 2 :(得分:0)

我自己正在研究同一问题。 PyPa文档建议在https://github.com/pypa/sample-namespace-packages

的'native'子目录中描述的布局

我发现以下所述的单个软件包结构非常有用,请参见有关测试“已安装”版本的讨论。 https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure 我认为这可以扩展到多个软件包。将在我了解更多信息后发布。