pip-根据可用的库版本指定下载版本

时间:2019-10-21 23:45:30

标签: python pip python-packaging

我正在开发依赖于其他软件包my_package的Python软件包foo_package

社区中使用了foo_package的几个版本,不幸的是它们彼此之间不向后兼容。 (由于更改了我的代码所针对的C接口)。

所以我想分发my_package的多个副本,对应于foo_package的不同版本。

我可以使用发布后的标签将my_package的这些不同副本彼此区分开。例如,我可以给my_package的版本1.1.4-foo_package1.2,对应于1.1.4的{​​{1}}版本my_package编译的1.2的版本foo_package

到目前为止,一切都很好。现在需要注意的是,在与pip一起安装时,最终用户必须指定此完整版本字符串才能获得my_package的正确版本。也就是说,他们必须知道my_package的最新版本是1.1.4,而他们正在使用的foo_package的版本是1.2,因此使用命令{ {1}}。

显然,出于各种原因,这并不理想。 (最终用户友好,避免依赖地狱……)毕竟,所有这些都可以通过编程确定!

是否有任何明智的方法来处理此问题,以便最终用户可以运行pip install my_package==1.1.4-foo_package1.2并自动下载正确的副本?

对类似问题here的回答不令人满意。

FWIW到目前为止,我想出的最好的解决方案是创建另一个软件包pip install my_package,作为其my_package_installer的一部分,它检查安装的setup.py版本,然后指定foo_package的相关版本作为my_package的{​​{1}}参数。但这完全是愚蠢的,而且似乎很脆弱。我不是唯一一个遇到这个问题的人。

2 个答案:

答案 0 :(得分:0)

从设计的角度来看,在我看来您应该将foo的一个版本指定为依赖项,因为这是最适合您的包的方法。如果其他人具有不同版本的foo,则这是他们的责任。

如果不是那么简单,并且您要限制与foo的多个版本的兼容性,那么我认为大多数开发人员所做的就是尝试在初始化时检测foo并从那里进行适应。

答案 1 :(得分:0)

如何从相同的代码库创建多个Python项目?

假设您有一个源代码存储库MyProject.git,并且您希望将其分发给libfoo1.2libfoo1.4。然后,看起来像这样的setup.py可以解决问题:

#!/usr/bin/env python3

import distutils.core
import setuptools

def get_foo_version():
    return '1.2' if True else '1.4'

foo_version = get_foo_version()

foo_module = distutils.core.Extension(
    'foo',
    define_macros=[('FOO_VERSION', foo_version)],
    libraries=['foo{}'.format(foo_version)],
    sources=['foo.c'],
    # ...
)

setuptools.setup(
   name='MyProjectForFoo{}'.format(foo_version),
   ext_modules = [foo_module],
   # ...
)

在这种情况下,您将得到两个Python项目MyProjectForFoo1.2MyProjectForFoo1.4。您的项目的用户仍然必须选择正确的项目,但是与按版本号排序相比,它更不会造成混淆。

您可能可以使用tox和/或良好的CI / CD系统来帮助您自动创建和发布两个(或更多)项目的发行版( wheels