为不同版本的Python维护不同版本的代码库的工作流程

时间:2009-10-10 03:10:21

标签: python git merge version organization

我正在开发一个名为GarlicSim的开源应用程序。

到目前为止,我一直在为Python 2.6开发它。它似乎不适用于任何其他版本。

我认为制作支持其他版本Python的版本非常重要。我想我会为2.5,3.1和2.4制作一个版本。

所以我有几个问题:

  1. 如何组织我的仓库的文件夹结构以包含这些不同的版本?
  2. 将一个版本的代码中的更改“合并”到其他版本的好方法是什么?我知道如何在我的SCM中进行合并(这是git),但这些文件夹都在同一个repo中,我想在它们之间进行合并。当然可以选择为每个版本设一个回购,但我认为这不是一个好主意。
  3. 有人有任何建议吗?

4 个答案:

答案 0 :(得分:3)

只有在极少数情况下,您才需要为不同版本提供单独的分支。你提到了上下文管理器,它们很棒,并且不会使用它们,你是对的。但是对于Python 2.4,你将不得不使用它们。所以那会很糟糕。因此,如果你想支持Python 2.4,你必须编写一个没有上下文管理器的版本。但是那个也可以在Python 2.6下工作,所以在那里有单独的版本是没有意义的。

至于Python 3,有一个单独的分支有一个解决方案,但通常不是最好的解决方案。 对于Python 3支持,有一个名为2to3的东西,它将你的Python 2代码转换为Python 3代码。它并不完美,所以你经常需要修改Python 2代码来生成很好的Python 3代码,但是Python 2代码最终会变得更好。

使用Distribute(一个维护的setuptools分支),您可以在安装过程中自动进行此对话。这样,即使对于Python 3,您也不必拥有单独的分支。有关该文档,请参阅http://bitbucket.org/tarek/distribute/src/tip/docs/python3.txt

正如Paul McGuire所写,甚至可以使用相同的代码支持Python 3和Python 2而不使用2to3,但如果你想支持除2.6和3.x以外的任何东西,我不会推荐它。你得到了太多这些丑陋的特殊黑客。使用2.6时,有足够的向前兼容性,可以编写体面的代码并支持Python 2.6和3.x,但不支持Python 2.5和3.x.

答案 1 :(得分:1)

我会尝试维护一个分支来覆盖所有python 2.4-2.6

差别并不是很大,毕竟如果你必须为2.4做一些额外的代码来做一些2.6中很容易的事情,那么从长远来看使用2.4版本对你来说就不那么重要了2.5和2.6。

Python 3应该有一个不同的分支,你应该尽可能地保持尽可能多的代码。

答案 2 :(得分:1)

如果您的代码不过度依赖于异常处理程序中的运行时性能,那么您甚至可能无需为Py3提供单独的分支。我已经设法为我的所有Py2.x版本保留了一个版本的pyparsing,虽然我不得不坚持使用“最小公分母”方法,这意味着我不得不放弃使用像生成器表达式这样的构造,并且你的观点,情境管理者。我使用dicts代替集合,并且我的所有生成器表达式都被包装为列表推导,因此它们仍然可以返回到Python 2.3。我的代码顶部有一个块,它处理了许多2vs3问题(由pyparsing用户Robert A Clark提供):

_PY3K = sys.version_info[0] > 2
if _PY3K:
    _MAX_INT = sys.maxsize
    basestring = str
    unichr = chr
    unicode = str
    _str2dict = set
    alphas = string.ascii_lowercase + string.ascii_uppercase
else:
    _MAX_INT = sys.maxint
    range = xrange
    def _str2dict(strg):
        return dict( [(c,0) for c in strg] )
    alphas = string.lowercase + string.uppercase

我遇到的最大困难是用于捕获异常的不兼容语法,这是在Py3中引入的,从

更改
except exceptiontype,varname:

except exceptionType as varname:

当然,如果你真的不需要异常变量,你可以写:

except exceptionType:

这将适用于Py2或Py3。但是,如果您需要访问异常,您仍然可以提供跨版本兼容的语法:

except exceptionType:
    exceptionvar = sys.exc_info()[1]

这有一个小的运行时间惩罚,这使得这在pyparsing的某些地方无法使用,所以我仍然需要维护单独的Py2和Py3版本。对于源合并,我使用实用程序WinMerge,我发现它非常适合保持源代码目录同步。

所以即使我保留了两个版本的代码,其中一些统一技术可以帮助我将差异保持在绝对不相容的最小值。

答案 3 :(得分:0)

我最终决定为我的项目提供4种不同的分叉,分别为2.4,2.5,2.6和3.1。我的主要优先事项是2.6,我不想为了2.4而牺牲代码的优雅。所以丑陋的兼容性黑客将在较低版本,而不是更高版本。