Setup.py install_requires查找本地src软件包

时间:2019-05-26 01:49:35

标签: python setuptools

我有多个存储库依赖的多个共享内部库。现在,这些库位于同一个git存储库中,并在需要时被子调制到每个应用程序中。在构建期间,我将pip install the libraries。我面临的问题是这些内部库也相互依赖,但是由于它们位于本地文件夹中,因此无法解决依赖关系。

例如,我的本地图书馆A依赖于B。这将无法工作

setup(
    name='A_package',
    install_requires=[
      'B_package',  # source file in local folder
    ],
    ...
)

因为pip尝试在PyPI上找到B_package。

我搜索了许多解决方案,但是似乎找不到像这样的直接解决方案

install_requires=[
          '/commonlib/path/B_package',
        ],

这样,我只需pip install A_package,B_package也将被定位并安装。

我希望将共享库源代码作为子模块,是为了简化开发,以便工程师可以在需要时修改和提交库。欢迎提出其他建议。

1 个答案:

答案 0 :(得分:1)

发布软件包的成本与开发速度

这两项之间的权衡是关键。

使用Git Repo:小规模时速度快,增长时会出现问题

这是我在公司中首次尝试的方法。我们不使用子模块,我们只是将git repo放在pip安装软件包的位置,例如/Users/xxx/miniconda3/lib/python3.6/site-packages。 pip将始终将该软件包视为已安装,并且我们将git repo同步以更新该软件包。

这在小规模上效果很好,但是在项目发展时会带来问题。当您使用git repo时,您使用的是git版本而不是pypi软件包版本,因此您需要手动维护版本依赖性。假设项目A使用程序包B,它们都有自己的版本,如何维护依赖关系,有两个选择:

  • 始终使用最新版本的B,B向后兼容-对于A来说很容易,但会给B带来负担。
  • 就像python软件包版本一样,在A中放置一个git版本或标签,人们每次切换到A中的另一个分支时都需要结帐B-对于具有多个分支的大型项目来说很痛苦

如果您有多个virtualenv,则必须要做额外的工作。

发布程序包,但最大限度地降低成本:前进的方式

这就是我最终在公司工作的结果。我设置了自己的pypi服务器和gitlab ci,以便在按下标签时发布程序包。它没有前一个问题,还支持快速开发迭代。

对于开发人员

$ git commit ...
$ git tag ...
$ git push && git push --tags

发布软件包只需要做两个命令,这很便宜。我们实际上使用bumpversion来管理版本,而不是手动标记。

对于用户

$ pip install -r requirements.txt

每次他们切换到A中的另一个分支或有人修复B中的错误时,他们只需要pip install

编辑2019.05.27

setup.py可以做您想做的事。运行pip install时,它将下载软件包,解压缩并运行python setup.py install,因此 您可以在setup.py中添加自定义逻辑:

install_requires = ['b', 'c', 'd']

# make sure it's in the python path and has been checked out
if is_package_b_installed_as_git_repo():
    install_requires.remove('b')

setup(
    name='A_package',
    install_requires=install_requries,
    ...
)
相关问题