繁体   English   中英

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

[英]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_packageinstall_requires参数。 但这完全是愚蠢的,而且看起来很脆弱。 我不能是唯一一个有这个问题的人。

从设计的角度来看,在我看来,您应该将 foo 的一个版本指定为依赖项,因为这对您的 package 最有效。 如果其他人有不同版本的 foo,那是他们的责任。

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

从同一个代码库创建多个 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 系统来帮助您自动创建和发布两个(或更多)项目的发行版(轮子)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM