[英]pip - specify download version based on available library version
我正在开发一个 Python package my_package
,它依赖于其他一些 package foo_package
。
社区中使用了几个版本的foo_package
,不幸的是它们彼此不向后兼容。 (因为我的代码编译的 C 接口发生了变化)。
所以我想分发my_package
foo_package
不同版本。
我可以使用发布后标签将这些不同的my_package
副本彼此区分开来。 例如,我可以为my_package
提供1.1.4-foo_package1.2
版本,对应于针对foo_package
1.2
版本编译的my_package
1.1.4
版本。
到目前为止,一切都很好。 现在需要注意的是,当使用pip
安装它时,最终用户必须指定此完整版本字符串才能获得正确版本的my_package
。 也就是说,他们必须知道my_package
的最新版本是1.1.4
,而他们正在使用的foo_package
版本是1.2
,因此使用命令pip install my_package==1.1.4-foo_package1.2
。
显然,出于各种原因,这并不理想。 (最终用户友好,避免依赖地狱......)毕竟,所有这些都可以通过编程来确定!
是否有任何明智的方法来处理此问题,以便最终用户只需运行pip install my_package
并自动下载正确的副本?
这里有一个类似问题的不令人满意的答案。
FWIW到目前为止我提出的最佳解决方案是创建另一个 package my_package_installer
作为setup.py
的一部分检查安装的foo_package
版本,然后将setuptools.setup
的相关版本指定为my_package
的install_requires
参数。 但这完全是愚蠢的,而且看起来很脆弱。 我不能是唯一一个有这个问题的人。
从设计的角度来看,在我看来,您应该将 foo 的一个版本指定为依赖项,因为这对您的 package 最有效。 如果其他人有不同版本的 foo,那是他们的责任。
如果它不是那么简单,并且您对与 foo 的多个版本的兼容性有限制,那么我认为大多数开发人员所做的就是尝试在初始化时检测 foo 并从那里适应它。
从同一个代码库创建多个 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 系统来帮助您自动创建和发布两个(或更多)项目的发行版(轮子)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.