deb 文件或 apt 中依赖项要求末尾的波形符 (~) 是什么意思?

deb 文件或 apt 中依赖项要求末尾的波形符 (~) 是什么意思?

我很想了解~Apt 的依赖项是如何处理的,或者它是如何为 deb 文件定义的(我不确定语法是在哪里定义的)。

我遇到了关于 Ubuntu (Focal) 元包的依赖关系,python3它具有依赖关系约束:python3.8 >= 3.8.2-1~请参阅这里)。

我相信软件包版本是定义好的,以便它们按词法顺序排序,但是当我检查 ubuntu focus 时,没有python3.8按词法排序的版本>= 3.8.2-1~,但有一个版本3.8.10-0ubuntu1~20.04.4推断 Ubuntu Focal 的依赖项已损坏(他们不是~) 或者在依赖中有一些特殊的含义。

我能找到的关于该主题的唯一文档是 Debian 的声明包之间的关系。但这没有提到~or 模式匹配。

~那么.deb 依赖项中尾随的含义是什么?

答案1

文档控制Version字段状态(请参阅页面了解完整算法):

首先确定完全由非数字字符组成的每个字符串的初始部分。这两部分(其中之一可能为空)进行词法比较。如果发现差异,则将其返回。

词法比较是修改后的 ASCII 值的比较,以便所有字母都比所有非字母排序更早,并且波形符在任何内容(甚至部分结尾)之前排序。例如,以下部分按从最早到最晚的顺序排列:~~~~a~、 空部分、a

脚注添加了有关波形符的内容:

一种常见用途~是用于上游预发布。例如, 1.0~beta1~svn1245排序早于1.0~beta1,排序早于1.0

答案2

描述了版本中的波形符在版本政策部分。基本上,波浪号在任何内容之前排序。

因此,>= 3.8.2-1~以 开头的任何版本都可以满足3.8.2-1,包括带有以波浪号本身开头的后缀的版本,例如3.8.2-1~bpo(用于向后移植),只要连续没有两个波浪号即可。事实上,此类依赖项(在版本(包括 Debian 修订版)末尾带有波浪号)通常用于促进向后移植。

由于这正是您的问题所在,并且 Debian 政策没有解决这一问题,因此值得更详细地讨论。典型的版本依赖关系如下所示python3.8 >= 3.8.2-1,需要 3.8.2-1 或更高版本的python3.8包。 Python 3.8 的任何更高版本的上游版本以及该软件包的任何更高版本的 Debian 版本(3.8.2-2 或 3.8.2-1ubuntu1 等)都可以满足这一要求。但这不能通过向后移植来满足,向后移植的版本形式为 3.8.2-1~bpo10+1;由于波形符排在空字符串之前,因此 3.8.2-1~bpo10+1 被认为小于 3.8.2-1。因此,使用这种形式的版本化依赖项向后移植包需要更改其依赖项,这违背了向后移植应尽可能接近原始包的一般规则。

因此,在版本化依赖项中添加波浪号作为版本的最后一个字符有助于稍微放松依赖关系:它允许具有相同前缀和波浪号分隔的后缀的版本,以满足版本化依赖项。这与以下相反预发布版本中波浪号的使用记录,这会导致版本不能满足最终版本的严格版本依赖关系。

(请注意,波浪号作为版本号中的最后一个字符,其中包括 Debian 修订版,如问题中给出的,不能允许上游预发布 - 这些看起来像 3.8.2~pre1-1,小于 3.8.2-1~。)

版本不是按词法排序的,而是按组件排序的,如果可能的话按数字排序,否则按词法排序。因此3.8.10-0ubuntu1~20.04.4确实满足这个关系:10大于2,因此满足依赖关系,比较到此为止。

相关内容