English 中文(简体)
我如何使用 SVN 和 distutils 为 Python 包分配版本号?
原标题:
  • 时间:2009-03-10 19:08:49
  •  标签:

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

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

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

最佳回答

在你的主包内,你可能有一个__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
问题回答

Importing the setup script inside your package is silly (especially since it may no longer be present after your library is installed), but importing your library inside setup.py should be fine. A separate text file would work too, but has the problem that you must install the text file with your package if you want to access the version number at runtime.

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

另请参阅将版本嵌入Python包的标准方法?,这是关于如何从一个位置(名为_version.py 的文件)传播版本信息到其他代码查找它的地方(例如命名为 __version__ PEP 0345 元数据的属性)。

然后看看 Brian Warner 的新工具“versioneer”,它可以从版本控制历史中生成 _version.py 文件。

另外,请查看我对将版本嵌入Python包的标准方法?的回答,更多人认识到可以避免从设置脚本导入模块的问题的方法,就越好。





相关问题
热门标签