python - setup.py install_requires 查找本地src包

标签 python setuptools

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

例如,我有本地库 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 也将被找到并安装。

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

最佳答案

发布包的成本与开发速度

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

使用 Git Repo:小规模速度良好,规模扩大时出现问题

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

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

  • 始终使用最新版本的 B,B 向后兼容 - 对 A 来说很容易,但会给 B 带来负担。
  • 就像Python包版本一样,在A中放置一个git修订版或标签,人们每次切换到A中的不同分支时都需要 checkout 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,
    ...
)

关于python - setup.py install_requires 查找本地src包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310063/

相关文章:

python - 如何从我的 .rst 文件访问 sphinx conf.py 中的变量?

python - 什么时候应该使用 "Natural Language"PyPI 分类器?

python - 将 argparse 与 Setuptools entry_points 一起使用

python - "InvalidRequirement: Invalid requirement, parse error"更新python包后出错

python - 如何使用 setuptools 将 Python 标记添加到 bdist_wheel 命令?

python - 如何使 easy_install 将包扩展到目录而不是单个 egg 文件中?

python原始字符串转义字符

python - 将文件从内存上传到 S3

python - Python 中的字典

python - 初始网络的类数(Tensorflow)