我有多个存储库依赖的多个共享内部库。现在,这些库位于同一个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也将被定位并安装。
我希望将共享库源代码作为子模块,是为了简化开发,以便工程师可以在需要时修改和提交库。欢迎提出其他建议。
答案 0 :(得分:1)
发布软件包的成本与开发速度
这两项之间的权衡是关键。
使用Git Repo:小规模时速度快,增长时会出现问题
这是我在公司中首次尝试的方法。我们不使用子模块,我们只是将git repo放在pip安装软件包的位置,例如/Users/xxx/miniconda3/lib/python3.6/site-packages
。 pip将始终将该软件包视为已安装,并且我们将git repo同步以更新该软件包。
这在小规模上效果很好,但是在项目发展时会带来问题。当您使用git repo时,您使用的是git版本而不是pypi软件包版本,因此您需要手动维护版本依赖性。假设项目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,
...
)