手动管理Python包的版本号一段时间后,寻求自动化的手段,是自然而然的。

手动管理版本

手动管理Python包的版本,需要注意两个方面:

  1. 每次发布新包前,要更新包的版本号。
  2. 在安装后的默认模块下应该有一个__version__变量,其值为版本号。

关于第一点,可以参考《PEP 440 -- Version Identification and Dependency Specification》; 关于第二点,可以参考《PEP 396 -- Module Version Numbers》。 当然,两边的版本号必须是相同的

除了手动修改两个版本号这种愚蠢的方案以外,要保持两边的版本号一致,无外乎两种方式:

  1. 通过包的版本号来给出__version__的值。
  2. 通过__version__的值来设置包的版本号。

具体的做法,可以参考《Single-sourcing the package version — Python Packaging User Guide》,其中给出了6种可行方案。 其中也有陷阱,但这里不再详述。 无论如何,这些方案里的版本号总是要手动去改的。

本文着重介绍其中的第7个方案——setuptools_scm

自动生成版本号

setuptools_scm是PYPA推荐的一个自动管理Python包版本号的工具,是setuptools的一个插件。 它会根据包括Git在内的各大VCS的tag,来自动生成一个版本号。

  • 当前commit就在tag上,代码没有修改: {tag}
  • 当前commit就在tag上,代码有修改: {tag}+dYYYMMMDD
  • 当前commit不在tag上,代码没有修改:{next_version}.dev{distance}+{scm letter}{revision hash}
  • 当前commit不在tag上,代码有修改: {next_version}.dev{distance}+{scm letter}{revision hash}.dYYYMMMDD

使用方式十分简单。 首先,在setup_requires中指定它。 然后,设置use_scm_version。 当然,旧的方式version=*也应该去掉。

from setuptools import setup

setup(
...
setup_requires=['setuptools_scm'],
use_scm_version=True,
# version='0.0.1', # delete this
...
)

如果Git库的根目录不在setup.py所在的目录,则会出错。 届时,可把use_scm_version替换为以下内容。

    use_scm_version={
"root": "..",
"relative_to": __file__,
},

relative_to是指相对于那里,通常设为setup.py所在目录; root是指定Git库的根目录的相对位置,这里示例的..表示上一级目录,可按需指定。

设置version

使用setuptools_scm方案,则版本号是在setup()函数中自动生成的。 主模块的__version__如果需要和它保持一致,就需要读取已安装的当前包的版本号。

def _get_version(default='x.x.x.dev'):
try:
from pkg_resources import DistributionNotFound, get_distribution
except ImportError:
return default
else:
try:
return get_distribution(__package__).version
except DistributionNotFound: # Run without install
return default
except ValueError: # Python 3 setup
return default
except TypeError: # Python 2 setup
return default __version__ = _get_version()

以上代码就是孤常用的一个方案。 如果出现任何意外,则返回一个明显错误的版本号x.x.x.dev。 比一般方案更复杂的一点是,孤考虑到了在setup.py中调用这个文件的情况,分别对Python 2.x和3.x做出了处理。

总结

setuptools_scm是一个不错的工具,打消了孤自己写一个的念头。 当然它也有一些不如人意的细节,比如next_version的设计。 但瑕不掩瑜,值得一试

用setuptools_scm来自动控制Python包的版本的更多相关文章

  1. python包的一些问题

    1查看python包的版本 2 卸载包的方法 3指定python包的安装版本 参考网址 https://blog.csdn.net/colourful_sky/article/details/8018 ...

  2. Python包管理工具和多版本环境管理

    1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...

  3. 离线pip下载Python包

    离线pip下载Python包   这几天搞Windows离线断网环境下安装Python包,配置环境,各种坑!做个记录,供以后查询吧.      # 生产环境  windows xp# python 2 ...

  4. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  5. RobotFramework中加载自定义python包中的library(一个py文件中有多个类)

    结构如下: appsdk\ appsdk.py(这里面有多个类,包括appsdk,appsdksync等类) __init__.py ... ① 有个appsdk的文件夹(符合python包的定义) ...

  6. python 包管理工具

    python 包管理工具 Python当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils,显得较为混乱. 而将来的工具链组合 ...

  7. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  8. 转: CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法

    from: http://www.linuxde.net/2014/05/15576.html CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法 2014/05/ ...

  9. python包管理工具

    pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品.本文将详细说明 安装 pip 的方法和 使用 pip 的一些基本操作如安装.更新和卸载 python ...

随机推荐

  1. java①

    1.MyEclipse Eclipse Idea 等 都是 开发java的IDE工具! 2.面试题: JDK: java开发工具包!(Java Development TooKit)! 是整个java ...

  2. selenium(七)expected_conditions EC

    判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方法, 一.功能介绍和翻译 ...

  3. IIS设置上传文件大小限制

    单位为字节. 500*1024*1024=524288000

  4. C/C++知识补充(2) C/C++操作符/运算符的优先级 & 结合性

    , 逗号操作符 for( i = 0, j = 0; i < 10; i++, j++ ) ... 从左到右   Precedence Operator Description Example ...

  5. (C/C++学习笔记) 二十. 文件和流

    二十. 文件和流 ● 文件的概念 文件(file) 一. C/C++语言将文件作为字节序列(sequence of characters)来对待,但从编码角度,或说从对字节信息的解释来看,文件分为:文 ...

  6. error: illegal character '\ufeff' 的解决方案

    今天使用scalac 命令编译scala文件的时候,出错了,出现如下错误提示:

  7. 2.10 C++利用构造函数限制对象的创建

    参考: http://www.weixueyuan.net/view/6342.html 总结: 限制对象的创建.限制创建对象时能够按照我们需要的那样创建,而不能随意的创建对象. 类中显示地声明了任意 ...

  8. Linux文件系统命令 lsof

    命令名:lsof 功能:查看某个端口被占用情况,在配置服务器端口的时候,为了避免冲突,可以通过这个命令查看将要被使用的端口是否被占用. 用法:加-i 参数 eg: renjg@renjg-HP-Com ...

  9. 在使用Idea配置jQuery的问题

    今天使用idea中引入jQuery代码时,发生的几个错误,时刻提醒 1.jQuery的驱动包要放置在web目录下 2.引入jQuery的驱动包时,语句格式为<script></scr ...

  10. chromium ②

    这篇研究两个问题:chromium对线程的封装和进程通信.主要参考chromium的官方技术文档:Treading和Inter-process Communication (IPC). chrome速 ...