在Python中创建版本库
我们在公司里正在设置新的分支,这些分支都会共享相同的库。
问题是,如果我们更新了某个库,可能会导致那些没有更新的应用程序出现问题。
所以我们想给我们的库加上版本号。
我打算这样做:
loader.load(name='mylib', version='1.0')
或者也可以这样:
import mylib
mylib.load(version='1.0')
问题是这个加载器是怎么工作的。
最简单的方法是把每个版本放在自己的文件夹里,但这样的问题是,如果所有版本都有一个共同的bug,那每个版本都得单独修复。
一个稍微好一点的方法(为了维护方便)是把所有版本的库放在同一个文件里,然后调用一个加载函数来创建指向这些函数的链接。
我不确定这样做会不会很美观(可能会变成几千行的庞大文件,当然我们可以删除旧的、不再使用的版本)。
为了减少版本的数量,我打算只有在破坏兼容性的时候才增加版本号,而不是在修复bug或添加新功能的时候。
Python里有没有类似的内置功能,或者有什么其他的解决方案可以用?
有没有人有这方面的经验?
我可以补充一下,使用这些库的是测试用例,我们只希望测试人员进入分支后运行 ./testit.py,其他的都不需要。
解决方案
这个解决方案是基于Gringo Suave的建议。
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
3 个回答
我知道以前 setuptools
有类似的功能。虽然我现在找不到,但这并不意味着它已经消失了。你可以去查查看。
我觉得这就是virtualenv的目的所在。从virtualenv的网站上可以看到:
virtualenv是一个用来创建独立Python环境的工具。
它解决的主要问题是依赖关系和版本问题,还有间接的权限问题。想象一下,你有一个应用需要LibFoo的1.0版本,但另一个应用却需要2.0版本。那你该如何同时使用这两个应用呢?
在这种情况下,virtualenv可以帮你。它会创建一个独立的环境,里面有自己的安装目录,不会和其他virtualenv环境共享库文件(而且你还可以选择不使用全局安装的库)。
通常,这种做法是通过增加模块名称的数字来实现的。你可以设计一个更复杂的方法,但这个方法是最简单易懂和容易实现的。
import package.modv2
import package.modv3
每次API(应用程序接口)发生变化时,就创建一个新的模块版本。
也可以在函数级别进行更改,这样可以减少文件的数量:
from package.module import functionv2
from package.module import functionv3