我真的很困惑如何正确地将我自己扩展的版本控制与我正在连接的上游库的版本化相结合。
有一个上游静态库(比如版本2_2_0_5
),我正在构建一个名为foobar
的Cython扩展,为它提供一个接口(比如版本0.5.3
)。因为上游库是巨大的,所以我无法一次性覆盖它的界面,所以我也需要自己编译我的扩展。
一旦发布了新版本的上游版本,我会为上游版本的上游版本采用最新版本的扩展程序,并根据上游版本的变化开始调整它,增加我自己的版本号。
我必须提供一种简单的方法来将我安装的扩展版本限制为给定的上游版本,例如pip install foobar[upstream==2.2.0.5]
。
foobar-2.2.0.5+0.5.3
我考虑使用本地版本标签,例如2.2.0.5+0.5.3
,但由于本地版本标签没有语义,我无法安装特定版本的扩展而没有明确提到上游版本 - 似乎没有办法告诉pip
执行类似pip install foobar>=*+0.5.3
的操作。
foobar-0.5.3+2.2.0.5
我的版本是"主要版本"而上游版本是我的本地版本标签,因此无法精确定位上游版本。
foobar_2_2_0_5-0.5.3
我考虑的另一个选项是将上游版本内联到包本身的名称中,所以我将foobar_2_2_0_5-0.5.3
和foobar_2_2_1_9-0.6.8
,但这对我来说似乎非常难看,并且不提供任何过滤功能 - 我无法为foobar
安装upstream~=2.2
。
foobar[upstream.2.2.0.5]-0.5.3
有"额外"在setuptools中,所以包可以与foobar[hello,there]
一起安装,但是没有办法添加版本 - 它们仅仅是标志。而且我不确定是否有额外的foobar[upstream.2.2.0.5]
实际上会提供任何帮助,并且可读性仍然受到影响。
理论上我可以使foobar
成为一个虚拟包"如果给出正确的额外信息,那将安装相关的依赖:
setup(
name='foobar',
extras_require={
'2.2.0.5': ['foobar_2_2_0_5'],
'2.2.1.9': ['foobar_2_2_1_9'],
}
)
在实践中,这将有效地禁用指定foobar
版本的方式,并且与foobar-2.2.0.5
方法基本上没有区别。
我还必须记住,上游开发人员可能会将我的扩展用于私有构建,因此有必要使构建标记保持在上游版本中。我不知道如何做到这一点。
此外,阅读本地版本标签的explanations on the purpose,可以清楚地看到我的使用与预期用途相矛盾。但是,我没有看到任何其他可以使用的机制。
鉴于这一切,我真的很困惑下一步该做什么,有没有办法解决这个问题而不重写setuptools
的一半,以及我是否遗漏了一些明显的解决方案。