手动管理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. [转载]springmvc学习之@ModelAttribute运用详解

    spring学习之@ModelAttribute运用详解 链接

  2. JavaScript -基础- 变量、常量

    一.变量 <script> var a=1 var b=3 var a= 1;   //使用var 定义变量,分号结尾(可不加,换行符也可) var b=3; var a= 1; var ...

  3. day26 第二阶段共享

    第二阶段共享--网络编程 一.C/S架构 : 客户端(client)/服务端(sever)框架 B/S架构: 浏览器(brower)/服务端(sever)架构 软件CS架构: 服务端连接到浏览器,QQ ...

  4. Java并发编程_synchronized关键字的用法(一)

    synchronized:意思是 同步,也就是 共享资源 Synchronized修饰方法:对象锁 Static Synchronized修饰方法:类锁 下面代码手动敲一遍,就会理解  一.Synch ...

  5. 延迟载入Dll(动态载入Dll)

    windows核心编程(第五版)20.3节的延迟载入Dll 延迟载入Dll技术出现的原因: 因为DLL的加载是比较浪费时间的,特别是大型软件加载,因此,这项技术是在应对软件初始化过程中避免浪费太多的时 ...

  6. CSS学习笔记-04 a标签-导航练习

    个人练习,各位大神勿笑  .. <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  7. Capjoint的merrcmd生成二次曲线的misfit原理

    http://www.personal.psu.edu/jhm/f90/lectures/lsq2.html

  8. cxf http 代码自动生成

    1.下载 cxf 直接进入镜像下载http://mirrors.tuna.tsinghua.edu.cn/apache/cxf/3.1.12/apache-cxf-3.1.12.zip 2.配置 CX ...

  9. tf 版本更新 记录

    tf 经常更新版本,网上教程又是各版本都有,且不标明版本,致使各种用法难以分清哪个新,哪个旧,这里做个记录,以前的博客我就不更新了,请大家见谅. tf.nn.rnn_cell 改为 tf.contri ...

  10. vue中七牛插件使用

    <template> <div id="cxUpload" class="cx-upload"> <button id=" ...