Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何处理依赖关系的多个主要版本_Python_Pip_Dependencies_Wrapper_Pypi - Fatal编程技术网

Python 如何处理依赖关系的多个主要版本

Python 如何处理依赖关系的多个主要版本,python,pip,dependencies,wrapper,pypi,Python,Pip,Dependencies,Wrapper,Pypi,我想知道如何处理依赖项库的多个主要版本 我有一个开源库,Foo,处于早期发布阶段。该库是另一个开源库的包装器,BarBar刚刚发布了一个新的主要版本Foo当前仅支持以前的版本。我猜很多人从以前的主要版本Bar转换到新的主要版本会非常慢,我自己也不愿意切换到新版本 如何最好地处理这个问题?在我看来,我有这些选择 切换到新的主要版本,可能会拒绝使用旧版本的用户 继续使用旧版本,可能会拒绝使用新版本的用户 拥有两个不同的分支,为所有新功能更新两个分支。不确定这是如何与PyPi一起工作的。我不是每次都要

我想知道如何处理依赖项库的多个主要版本

我有一个开源库,
Foo
,处于早期发布阶段。该库是另一个开源库的包装器,
Bar
Bar
刚刚发布了一个新的主要版本
Foo
当前仅支持以前的版本。我猜很多人从以前的主要版本
Bar
转换到新的主要版本会非常慢,我自己也不愿意切换到新版本

如何最好地处理这个问题?在我看来,我有这些选择

  • 切换到新的主要版本,可能会拒绝使用旧版本的用户
  • 继续使用旧版本,可能会拒绝使用新版本的用户
  • 拥有两个不同的分支,为所有新功能更新两个分支。不确定这是如何与PyPi一起工作的。我不是每次都要发布不同的版本号吗
  • 将存储库分为两部分。我真的不想这么做
  • 对我来说,理想的解决方案是使用相同的代码库,在这里我可以使用某种类似C/C++宏的东西,如果版本是
    new
    ,使用
    new\u bar\u函数
    ,否则使用
    old\u bar\u函数
    。从PyPi安装库时,主版本的已安装版本决定使用哪个版本。如果未安装版本,请安装最新版本


    非常感谢您提供一些提示。

    通常情况下,在使用
    软件包导入后,软件包版本信息可用。\uuuuuu版本\uuuuu
    。您可以从
    Bar
    解析该信息,并根据该信息决定要做什么(选择适当的函数调用或停止程序或引发错误或…)

    您还可以从中了解一些控制依赖项安装的方法

    似乎如果某人已经安装了
    Bar
    ,那么安装
    Foo
    只会更新
    Bar
    if
    Foo
    明确要求使用新版本。看到了吗

    拥有两个不同的分支,为所有新功能更新两个分支。不确定这是如何与PyPI一起工作的。我不是每次都要发布不同的版本号吗


    是的,您可以有一个1.x版本(支持旧版本)和一个2.x版本(支持新版本),并同时发布这两个版本。这是一种常见的模式,适用于那些希望引入突破性更改,但仍希望继续维护以前版本的软件包。

    即使库的主要版本之间的更改不一定会影响我的库?我认为如果它影响到使用库的用户,这将是适当的,但是如果没有更多的信息,很难说。我遇到了与OP相同的情况。虽然我会首先尝试@fabianegli的答案作为一个快速的破解,但这里的“将Foo拆分为1.x和2.x分支”主题导致了一个通用的实现:当我的库
    Foo 1.x
    对库
    Bar 1.x
    有内部依赖时,尽管
    Foo
    没有在其API表面直接公开
    old\u bar\u function()
    ,但它仍然隐式地公开(或者我们甚至称之为需求)在当前环境/命名空间中固定
    bar.old\u bar\u function()
    。因此,只要将依赖项升级到
    Bar 2.x
    就可以证明在
    Foo
    上进行重大版本升级是合理的。对不?那可能有用。但这不是坏习惯吗?我想我以前从未见过在源代码中使用过。通常仅在初始化或设置文件中。您可以在初始化文件中明确定义函数,以实现“…如果版本为
    new
    ,请使用
    new\u bar\u function
    ,否则请使用
    old\u bar\u function
    ,方法是将适当的值分配给
    bar\u function
    ,然后使用
    bar\u function
    。话虽如此,我同意@di的观点,即在不讨论设计选择和具体情况的情况下,很难判断应该采取哪种方法。i、 e.功能在输入/输出方面是否表现不同?是否只有一个函数,或者您是否必须更改
    Foo
    的实质部分才能从一个版本转换到另一个版本(在两个方向)?我将此标记为正确,因为从技术上讲,这是我正在寻找的解决方案。我最终意识到,通过稍微聪明一点,我可以绕过纯代码中的差异,而无需版本控制。一、 因此,我们可以支持这两个版本,因为我的包装器库只涉及核心,而不是新特性。但感谢你们两位给出的好答案。