用setuptools_scm来自动控制Python包的版本

手动管理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的设计。 但瑕不掩瑜,值得一试

原文地址:https://www.cnblogs.com/ExMan/p/10678565.html

时间: 2024-10-11 12:51:07

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

Centos 7.2 安装 Python 3.5(适用于Python 3所有版本安装)

提示:我们必须不能破坏系统的环境.因为几个关键的应用程序依赖于Python 2.7.5(centos 7默认版本).如果替换了系统的Python环境就会发生很多难以预见的错误,甚至要重装系统. 安装前准备 yum -y install epel-*yum clean allyum makecache yum -y install gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel 下载p

在Pypi上发布自己的Python包

使用Python编程的都知道,Python的包安装非常的方便,一般都是可以pip来安装搞定: sudo pip install <package name> pip的安装请移步:https://pip.pypa.io/en/stable/installing/ 最近因为项目上的需要,发布了一个自己的pypi Python包,这里我大致分享如何发布自己的Pypi包一般过程. 打包工作主要依赖python的一个叫setuptools的包来完成,在进行下面操作前请使用pip安装它: sudo pip

[转载]Python 包管理工具解惑

原文链接:http://zengrong.net/post/2169.htm Python 包管理工具解惑 python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? distutils setuptools distribute disutils2 distlib pip 什么时候该用pip,什么时候该用 setup.py ,它们有关系么? easy_install.ez_setup

CentOS 6.4安装pip,CentOS安装python包管理安装工具pip的方法

之前有的朋友问我,CentOS版本怎么安装python的pip,我之前给出的Ubuntu下apt-get的方法 ubuntu 需要先安装下pip吧, apt-get install python-pip 安装requests, pip install requests 但是有的朋友由于是centos的,直接 yum install pip  或者 yum install python-pip都是不行的. 其实不能yum那就直接下载编译安装呗... CentOS 6.4安装pip,CentOS安装

Python包管理工具之间的关系

转自http://www.nowamagic.net/academy/part/13/302/ 当前的包管理工具链是 easy_install/pip + distribute/setuptools + distutils, 显得较为混乱. 而将来的工具链组合非常简单:pip + distutils2. 1. distutils : Python 自带的基本安装工具,适用于非常简单的应用场景,使用: 为项目创建 setup.py 脚本. 执行 setup.py install 可进行安装. 2.

在windows下安装python包管理器pip及使用

从来没有在Windows下用过pip,今天试了下,原来pip也可以在Windows下安装,使用也和Linux下一样简单. 先从下面的地址下载pip源码: http://pypi.python.org/pypi/pip/ 最新版本是6.0.8,下载连接为: http://pypi.python.org/packages/source/p/pip/pip-6.0.8.tar.gz#md5=2332e6f97e75ded3bddde0ced01dbda3 下载下来后解压,打开命令行: 1.利用cd命令

Python包管理工具Distribute的安装

Python包管理工具Distribute的安装 Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute,那麽这几个工具有什么关系呢,看一下下面这个图就明白了: 可以看到distribute是setuptools的替代方案,pip是easy_install的替代方案. Distribute提供一个安装python模块的框架.你系统的每一个python解释器都需要它自己的Distribute.你可以自己找到最新版本的Distribut

Windows下使用pip安装python包是报错-UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0xcb in position 0

先交待下开发环境: 操作系统:Windows 7 Python版本:2.7.9 Pip版本:6.1.1 其他环境忽略 在windows下使用pip下载python包,出现如下错误 [plain] view plain copy Collecting xxxxxx Exception: Traceback (most recent call last): File "D:\Python27\lib\site-packages\pip-6.0.8-py2.7.egg\pip\basecommand.

windows 新版xgboost Python包安装教程 win10 64

windows 新版xgboost Python包安装教程 win10 64 第一次写教程,不妥之处望大家海涵 O(∩_∩)O! 写这篇文章的起因是男票让我帮他装xgb,不幸让我装好了~~ 他说这个好麻烦,装好了可以写一篇博客了,so~ 其实我基本完全是按照下面这位大虾的步骤做的(),下面给出链接: 64位win10下安装xgboost python包的教程:http://www.th7.cn/system/win/201603/157092.shtm 下面讲一下我的步骤(简化补充版,详情请参考