手动管理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. 《Python》网络编程之黏包

    黏包 一.黏包现象 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. server端 import socket sk = s ...

  2. Git超实用总结

    Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史,这几乎是所有操作的本质,但是为了文章更加简单易懂, ...

  3. SharePoint Framework 企业向导(十)

    博客地址:http://blog.csdn.net/FoxDave 接上一讲 SharePoint Framework部署范围 对于SharePoint Framework解决方案,只有一个部署范围: ...

  4. urlencode urldecode

    1.urlencode()函数原理就是首先把中文字符转换为十六进制,然后 在每个字符前面加一个标识符%. urldecode()函数与urlencode()函 数原理相反,用于解码已编码的 URL 字 ...

  5. Java学习笔记26(异常)

    异常的定义: Java代码在运行过程中发生的问题就是异常 异常类:出现问题就会常见异常类对象,并抛出异常的相关信息,异常的位置,原因 异常体系: Throwable类是java中所有错误或异常的父类 ...

  6. natapp 穿透访问 vue项目 Invalid Host header

    由于要近期开发微信小程序,所以今天了解了一下这个netapp 内网映射这个东西,所以一开始自己就在网上看,然后想把环境部署起来,参考https://natapp.cn/ ,看了一分钟教程以后,然后自己 ...

  7. Ubuntu创建新用户并设置权限

    打开终端开启root账户 sudo passwd -u root 设置root密码,输入两次 sudo passwd root 切换root账号 su - 或 su root 退出root账户使用ex ...

  8. 顶部BANNER

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 找出n个自然数(1,2,3,……,n)中取r个数的组合

    <?php /** * 对于$n和$r比较小, 可以用这种方法(当n=5, r=3时) */ function permutation1($n, $r) { for($i=1; $i<=$ ...

  10. 【leetcode】20-ValidParentheses

    problem Valid Parentheses code class Solution { public: bool isValid(string s) { stack<char> p ...