Python Setup.py安装\u需要查找本地src包

Python Setup.py安装\u需要查找本地src包,python,setuptools,Python,Setuptools,我有许多存储库所依赖的多个共享内部库。现在,这些库位于同一个git存储库中,并在需要时分模块到每个应用程序中。在构建期间,我将pip安装库。我面临的问题是,这些内部库也相互依赖,但依赖关系无法解决,因为它们位于本地文件夹中 例如,我有本地图书馆A依赖于B。这将不起作用 setup( name='A_package', install_requires=[ 'B_package', # source file in local folder ], ..

我有许多存储库所依赖的多个共享内部库。现在,这些库位于同一个git存储库中,并在需要时分模块到每个应用程序中。在构建期间,我将
pip安装库
。我面临的问题是,这些内部库也相互依赖,但依赖关系无法解决,因为它们位于本地文件夹中

例如,我有本地图书馆A依赖于B。这将不起作用

setup(
    name='A_package',
    install_requires=[
      'B_package',  # source file in local folder
    ],
    ...
)
因为pip试图在PyPI上找到B_包

我已经寻找了很多解决方案,但是,我似乎找不到一个直接的解决方案,例如

install_requires=[
          '/commonlib/path/B_package',
        ],
这样,我就可以
pip安装一个_包
,然后也会找到并安装一个_包


我希望将共享库源代码作为子模块的原因是为了使开发更容易,以便工程师可以在需要时修改和提交库。欢迎提出任何其他建议。

发布包的成本与开发速度之比

这两件事之间的权衡是关键

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

这是我在公司第一次尝试的。我们不使用子模块,我们只是将git repo放在pip安装包的地方,比如
/Users/xxx/miniconda3/lib/python3.6/site-packages
。pip将始终将该包视为已安装,我们将同步该git repo以更新该包

这在小规模下非常有效,但在项目增长时会带来问题。当您使用git-repo时,您使用的是git-revision而不是pypi包版本,因此您需要手动维护版本依赖关系。假设项目A使用包B,它们都有自己的版本,如何维护依赖关系,两个选项:

  • 始终使用最新版本的B,B是向后兼容的-对A来说很容易,但会给B带来负担
  • 就像python包版本一样,将git修订版或标记放在a中,人们每次切换到a中的不同分支时都需要签出B—对于具有多个分支的大型项目来说,这很痛苦
如果你有多个virtualenv,你必须做额外的工作

发布软件包但将成本降至最低:前进之路

这就是我在公司的结局。我设置了我们自己的pypi服务器和gitlab ci,以便在推送标记时发布包。它没有上一个的问题,并且支持快速开发迭代

开发商

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

用户

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

编辑2019.05.27

使用
setup.py
可以执行您想要的操作。当您运行
pip安装
时,它将下载软件包,解包并运行
python setup.py安装
,因此 您可以在
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,
    ...
)

您好@CtheSky,谢谢您的深入回复。我理解你的观点,我同意这是一个长期的解决办法。之前,我们使用子模块将公共库签出到包中,因为它们是源代码的一部分。问题是它可能需要为未使用的库安装未使用的依赖项。因此,我希望使包可以安装,以便更好地处理依赖关系。然而,我真的试图避免使用我自己的pypi服务器。@Andy你可以使用官方的pypi。我相信您的问题可以通过在
setup.py
中添加自定义代码来解决,请参阅我的更新答案。现在,我正在Docker中放置包含单独py包的整个公共库repo。我希望
pip安装/common/B
,然后它还将在
/common/A
中安装依赖项。有办法吗?即使使用setup.py技巧,这是非常有趣的,但我不确定如何实现它。
pip
确实提供了此功能,您可以使用选项
--索引url
--额外索引url
指定pypi服务器来搜索包,它还具有内置的VCS支持,可以检查这些。事实上,你想要达到的目标是非常具体的,我建议你通读全文@老实说,如果您真的想“使包可安装,以便更好地处理依赖关系”,请发布pypi包。
$ pip install -r requirements.txt
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,
    ...
)