我正在开发依赖于其他软件包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}}参数。但这完全是愚蠢的,而且似乎很脆弱。我不是唯一一个遇到这个问题的人。
答案 0 :(得分:0)
从设计的角度来看,在我看来您应该将foo的一个版本指定为依赖项,因为这是最适合您的包的方法。如果其他人具有不同版本的foo,则这是他们的责任。
如果不是那么简单,并且您要限制与foo的多个版本的兼容性,那么我认为大多数开发人员所做的就是尝试在初始化时检测foo并从那里进行适应。
答案 1 :(得分:0)
如何从相同的代码库创建多个Python项目?
假设您有一个源代码存储库MyProject.git
,并且您希望将其分发给libfoo1.2
和libfoo1.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.2
和MyProjectForFoo1.4
。您的项目的用户仍然必须选择正确的项目,但是与按版本号排序相比,它更不会造成混淆。
您可能可以使用tox和/或良好的CI / CD系统来帮助您自动创建和发布两个(或更多)项目的发行版( wheels )