用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 ...
随机推荐
- [转载]springmvc学习之@ModelAttribute运用详解
spring学习之@ModelAttribute运用详解 链接
- JavaScript -基础- 变量、常量
一.变量 <script> var a=1 var b=3 var a= 1; //使用var 定义变量,分号结尾(可不加,换行符也可) var b=3; var a= 1; var ...
- day26 第二阶段共享
第二阶段共享--网络编程 一.C/S架构 : 客户端(client)/服务端(sever)框架 B/S架构: 浏览器(brower)/服务端(sever)架构 软件CS架构: 服务端连接到浏览器,QQ ...
- Java并发编程_synchronized关键字的用法(一)
synchronized:意思是 同步,也就是 共享资源 Synchronized修饰方法:对象锁 Static Synchronized修饰方法:类锁 下面代码手动敲一遍,就会理解 一.Synch ...
- 延迟载入Dll(动态载入Dll)
windows核心编程(第五版)20.3节的延迟载入Dll 延迟载入Dll技术出现的原因: 因为DLL的加载是比较浪费时间的,特别是大型软件加载,因此,这项技术是在应对软件初始化过程中避免浪费太多的时 ...
- CSS学习笔记-04 a标签-导航练习
个人练习,各位大神勿笑 .. <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- Capjoint的merrcmd生成二次曲线的misfit原理
http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html
- cxf http 代码自动生成
1.下载 cxf 直接进入镜像下载http://mirrors.tuna.tsinghua.edu.cn/apache/cxf/3.1.12/apache-cxf-3.1.12.zip 2.配置 CX ...
- tf 版本更新 记录
tf 经常更新版本,网上教程又是各版本都有,且不标明版本,致使各种用法难以分清哪个新,哪个旧,这里做个记录,以前的博客我就不更新了,请大家见谅. tf.nn.rnn_cell 改为 tf.contri ...
- vue中七牛插件使用
<template> <div id="cxUpload" class="cx-upload"> <button id=" ...