如何使用SVN和distutils为Python包分配版本号?

4

我正在编写一个Python包。该包需要在内部知道其版本号,同时还需要在distutilssetup.py脚本中包含此版本。

有什么最好的方法可以做到这一点,以便版本号不需要在两个不同的地方维护?我不想从我的库的其余部分导入setup.py脚本(这似乎相当愚蠢),也不想从setup.py脚本中导入我的库(同样如此)。理想情况下,我只需在svn中设置一个关键字,并自动将其替换为文件中的内容,但这似乎在svn中不可能。我可以读取包含版本号的公共文本文件-这是最好的解决方案吗?

澄清一下:我希望在一个地方维护版本号。是的,我可以在包中放置一个变量,并再次在setup.py文件中放置一个变量。但是,它们不可避免地会失去同步。

4个回答

5

你的主要包里面,很可能有一个__init__.py文件,对吧?

目录结构:

> ./packageTest
>   ./packageTest/__init__.py
>   ./packageTest/setup.py

__init__.py 文件中,添加以下行:

# package directory __init__.py
__version__ = 1.0

setup.py文件:

# setup.py
from packageTest import __version__
...

现在,在任何从包目录导入的模块中(我将其称为packageTest),您可以执行以下操作:

from packageTest import setup
print 'Setup.py version:', setup.__version__  
# prints Setup.py version: 1.0

这并没有告诉我setup.py中的版本,是吗? - Chris B.
你也可以在setup.py中添加__version__,而使用__init__.py则是为整个包定义版本。 - Jason Coon
1
我认为他想要只写一次,这样每次更新时他只需要更新两个地方... - Andrea Ambu
你是在建议我从setup.py脚本中导入我的包吗?那行不通,对吧? - Chris B.
你提出了一个不寻常的布局建议。通常设置脚本会在包目录所在的目录中(在你的情况下是名为packageTest的目录)。 - theller
显示剩余2条评论

0

将设置脚本导入您的包内是愚蠢的(尤其是在安装您的库后,它可能不再存在),但在setup.py中导入您的库应该没问题。
一个单独的文本文件也可以,但问题在于如果要在运行时访问版本号,则必须随包一起安装文本文件。


在安装软件包之前执行的setup.py不是与创建安装程序时执行的相同的setup.py吗?或者distutils会编写一个不同的setup.py吗? - Chris B.
是setup.py脚本安装您的软件包(如果运行'setup.py install'),或者创建您的软件包的安装程序(例如,如果运行'setup.py bdist_wininst')。设置脚本本身不会被安装。 - theller

0

我在我的项目中遇到了类似的问题。我编写了一个名为build.py的顶层测试/构建/打包/部署脚本(请注意,它不是基于distutils的)。 它读取一个属性文件,其中包含集中式版本号。我没有直接维护setup.py文件,而是保持一个模板文件,我的build.py脚本读取它,用props文件中的值替换版本变量,然后写出setup.py脚本。然后我的脚本文件将执行它以生成软件包或上传到pypi。


0

请参考将版本嵌入Python包的标准方法?,该方法涉及如何从一个位置(名为_version.py的文件)传播版本信息到其他代码查找它的地方(例如,名为__version__PEP 0345元数据的属性)。

然后,请查看Brian Warner的新的“versioneer”工具,该工具可以从修订控制历史记录生成_version.py文件。

此外,请查看我的回答将版本嵌入Python包的标准方法?,越多人意识到有一种避免从设置脚本导入模块的问题的方法,就越好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接