runsisi's

technical notes

deb 包版本大小比较

2019-02-02 runsisi#deb

deb 包的版本号组成如下:[epoch:]upstream_version[-debian_revision]

Ubuntu 下面没有找到类似 rpm -qa 的查看当前已安装的包的原始文件名的工具,所有的工具都显示的是解析后的包信息,因此不是很确定 epoch 字段会不会出现在原始的 deb 安装包文件名中,但是理论上应该是和 rpm 包一样,epoch 只是一个属性值,一般不直接体现在原始的安装包文件名中。

安装包 nameversionarch 以下划线作为分隔,其中 upstream_versiondebian_revision 以最后一个中划线作为分隔,以如下所示的安装包为例:

ceph-common_14.0.1-747-gc89e071-1bionic_amd64.deb
name: ceph-common
version: 14.0.1-747-gc89e071-1bionic
upstream_version: 14.0.1-747-gc89e071
debian_revision: 1bionic
arch: amd64

版本号的比较有 python 和 shell 两种方式:

import apt_pkg
apt_pkg.init_system()

a = '12.2.9-1ubuntu'
b = '12.2.9-1+ubuntu'
vc = apt_pkg.version_compare(a, b)
if vc > 0:
    print('version a > version b')
elif vc == 0:
    print('version a == version b')
elif vc < 0:
    print('version a < version b')
~$ dpkg --compare-versions 12.2.9-1ubuntu lt 12.2.9-1+ubuntu && echo true
true
~$ dpkg --compare-versions 12.2.9-1ubuntu gt 12.2.9-1+ubuntu && echo true

参考资料

Debian Policy Manual

https://www.debian.org/doc/debian-policy/ch-controlfields.html#version

Python: How to compare Debian package versions

https://stackoverflow.com/questions/4957514/python-how-to-compare-debian-package-versions