在python中创建版本库

在python中创建版本库,python,versioning,Python,Versioning,我们正在建立新的分支机构,所有分支机构都将共享相同的库 问题是,如果我们更新一个库,您可能会破坏所有未更新的应用程序 因此,我们希望对我们的库进行版本设置。 我计划这样做的方式要么是这样 loader.load(name='mylib', version='1.0') 或者像这样: import mylib mylib.load(version='1.0') 问题是这个加载器将如何工作。 最简单的方法是将每个版本放在自己的文件夹中,但问题是如果所有版本中都有一个常见的bug,那么每个版本都需

我们正在建立新的分支机构,所有分支机构都将共享相同的库

问题是,如果我们更新一个库,您可能会破坏所有未更新的应用程序

因此,我们希望对我们的库进行版本设置。
我计划这样做的方式要么是这样

loader.load(name='mylib', version='1.0')
或者像这样:

import mylib
mylib.load(version='1.0')
问题是这个加载器将如何工作。
最简单的方法是将每个版本放在自己的文件夹中,但问题是如果所有版本中都有一个常见的bug,那么每个版本都需要单独修复

一个稍微好一点的方法(对于可维护性)是将库的所有版本都放在同一个文件中,并调用一些加载函数来创建函数的链接。 我不知道这会有多漂亮(我们可能会得到几千行的怪物文件,我们当然可以删除旧的、未使用的版本)

为了帮助减少版本数量,我计划在破坏兼容性时只增加版本数量,而不是在修复bug或添加新内容时

python或其他方法中是否内置了类似的东西

有人有这方面的经验吗


我可以补充一点,使用libs的东西都是测试用例,我们只希望测试人员将cd放入分支并运行。/testit.py,没有其他内容


解决方案 解决方案是基于外国佬苏亚夫的建议

class MyClass_1_0:
    def func1(self):
        return 'Baz'

    def func2(self):
        return 'Bar'

class MyClass_1_1(MyClass_1_0):
    # Overwriting a function:
    def func1(self):
        return 'Foo'

    # Definining a new function which uses a function
    # from a previous version:
    def func3(self):
        print("{} {}".format(self.func1(), self.func2()))

# Change this to the latest version for stuff that always wants the latest
class MyClass(MyClass_1_1): pass
用法示例:

>>> from my.module import MyClass_1_1 as MyClass
>>> m = MyClass()
>>> m.func3()
Foo Bar

我知道
setuptools
以前也有类似的东西。我现在找不到,但这并不意味着它不见了。您可能需要研究它。

通常情况下,这是通过增加模块名称来完成的。您可以设计一个更健壮的方法,但这是最容易理解/实现的

import package.modv2
import package.modv3
每次更改API时创建新的模块版本

也可以在功能级别执行此操作,以尽量减少文件数量:

from package.module import functionv2
from package.module import functionv3
我相信这就是设计的目的。从:

virtualenv是一种创建孤立Python环境的工具

要解决的基本问题是依赖关系和版本, 和间接许可。假设您有一个需要 LibFoo版本1,但另一个应用程序需要版本2。怎么 您能同时使用这两种应用程序吗

在[这种情况下],virtualenv可以帮助您。它创造了一个环境 有自己的安装目录,不共享 具有其他VirtualEnvironment的库(也可以不使用) 访问全局安装的库)


两个模块可以在同一个文件中?不完全是。。。两个模块的内容可以是。很好,然后我们可以从package.module import functionv2作为function执行
,您可能会想到Nope,
setuptools
过去有一种方式可以说“导入此特定版本的库
foo
”。与入口点非常不同。这不是我们想要的,我们希望在运行时进行选择。