Python Setup.py安装\u需要查找本地src包
我有许多存储库所依赖的多个共享内部库。现在,这些库位于同一个git存储库中,并在需要时分模块到每个应用程序中。在构建期间,我将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 ], ..
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—对于具有多个分支的大型项目来说,这很痛苦
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,
...
)