用setuptools_scm来自动控制Python包的版本
手动管理Python包的版本号一段时间后,寻求自动化的手段,是自然而然的。
手动管理版本
手动管理Python包的版本,需要注意两个方面:
- 每次发布新包前,要更新包的版本号。
- 在安装后的默认模块下应该有一个
__version__
变量,其值为版本号。
关于第一点,可以参考《PEP 440 -- Version Identification and Dependency Specification》; 关于第二点,可以参考《PEP 396 -- Module Version Numbers》。 当然,两边的版本号必须是相同的。
除了手动修改两个版本号这种愚蠢的方案以外,要保持两边的版本号一致,无外乎两种方式:
- 通过包的版本号来给出
__version__
的值。 - 通过
__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包的版本的更多相关文章
- python包的一些问题
1查看python包的版本 2 卸载包的方法 3指定python包的安装版本 参考网址 https://blog.csdn.net/colourful_sky/article/details/8018 ...
- Python包管理工具和多版本环境管理
1. Python包管理工具 在安装Python包的过程中,经常涉及到distutils.setuptools.distribute.setup.py.easy_install.easy_instal ...
- 离线pip下载Python包
离线pip下载Python包 这几天搞Windows离线断网环境下安装Python包,配置环境,各种坑!做个记录,供以后查询吧. # 生产环境 windows xp# python 2 ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- RobotFramework中加载自定义python包中的library(一个py文件中有多个类)
结构如下: appsdk\ appsdk.py(这里面有多个类,包括appsdk,appsdksync等类) __init__.py ... ① 有个appsdk的文件夹(符合python包的定义) ...
- python 包管理工具
python 包管理工具 Python当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils,显得较为混乱. 而将来的工具链组合 ...
- Python 包管理工具解惑
Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...
- 转: 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/ ...
- python包管理工具
pip 是一个安装和管理 Python 包的工具 , 是 easy_install 的一个替换品.本文将详细说明 安装 pip 的方法和 使用 pip 的一些基本操作如安装.更新和卸载 python ...
随机推荐
- java①
1.MyEclipse Eclipse Idea 等 都是 开发java的IDE工具! 2.面试题: JDK: java开发工具包!(Java Development TooKit)! 是整个java ...
- selenium(七)expected_conditions EC
判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方法, 一.功能介绍和翻译 ...
- IIS设置上传文件大小限制
单位为字节. 500*1024*1024=524288000
- C/C++知识补充(2) C/C++操作符/运算符的优先级 & 结合性
, 逗号操作符 for( i = 0, j = 0; i < 10; i++, j++ ) ... 从左到右 Precedence Operator Description Example ...
- (C/C++学习笔记) 二十. 文件和流
二十. 文件和流 ● 文件的概念 文件(file) 一. C/C++语言将文件作为字节序列(sequence of characters)来对待,但从编码角度,或说从对字节信息的解释来看,文件分为:文 ...
- error: illegal character '\ufeff' 的解决方案
今天使用scalac 命令编译scala文件的时候,出错了,出现如下错误提示:
- 2.10 C++利用构造函数限制对象的创建
参考: http://www.weixueyuan.net/view/6342.html 总结: 限制对象的创建.限制创建对象时能够按照我们需要的那样创建,而不能随意的创建对象. 类中显示地声明了任意 ...
- Linux文件系统命令 lsof
命令名:lsof 功能:查看某个端口被占用情况,在配置服务器端口的时候,为了避免冲突,可以通过这个命令查看将要被使用的端口是否被占用. 用法:加-i 参数 eg: renjg@renjg-HP-Com ...
- 在使用Idea配置jQuery的问题
今天使用idea中引入jQuery代码时,发生的几个错误,时刻提醒 1.jQuery的驱动包要放置在web目录下 2.引入jQuery的驱动包时,语句格式为<script></scr ...
- chromium ②
这篇研究两个问题:chromium对线程的封装和进程通信.主要参考chromium的官方技术文档:Treading和Inter-process Communication (IPC). chrome速 ...