gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:49:13 25 4
gpt4 key购买 nike

我有多个共享内部库,许多存储库都依赖这些库。现在,这些库位于同一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com