我很想知道~
Apt 在依赖项中是如何处理的,或者它是如何为 deb 文件定义的(我不确定语法的确切定义位置)。
我遇到了关于python3
具有依赖约束的 Ubuntu (Focal) 元包的依赖关系:(python3.8 >= 3.8.2-1~
见这里)。
我相信包版本的定义是为了让它们按词法排序,但是当我检查 ubuntu 焦点时,没有python3.8
按词法排序的版本,>=
3.8.2-1~
但是有一个版本3.8.10-0ubuntu1~20.04.4
推断 Ubuntu Focal 的依赖项被破坏(它们不是)或者有依赖中的一些特殊含义~
。
我能找到的关于该主题的唯一文档是 Debian 的Declaring Relations between packages。但这并没有提到 a ~
or 模式匹配。
那么~
.deb 依赖项中的尾随是什么意思?
控制字段状态的文档(请参阅
Version
完整算法的页面):一个脚注添加了这个关于波浪号的内容:
版本中的波浪号在版本政策一节中进行了描述。基本上,波浪线在任何东西之前排序。
因此
>= 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 等)都可以满足这一要求。但它不会满足于 backports,它有 3.8.2-1~bpo10+1 形式的版本;由于波浪号在空字符串之前排序,因此认为 3.8.2-1~bpo10+1 小于 3.8.2-1。因此,使用这种形式的版本化依赖项向后移植包需要更改它们的依赖项,这与向后移植应尽可能接近原始包的一般规则背道而驰。因此,在版本化依赖中添加波浪号作为版本的最后一个字符有助于稍微放松依赖:它允许具有相同前缀和波浪号分隔后缀的版本来满足版本化依赖。这与记录使用波浪线的 pre-releases相反,这导致版本不能满足最终版本的严格版本依赖。
(请注意,波浪号作为包含 Debian 修订版的版本号中的最后一个字符,如问题中所述,不能允许上游预发布 - 看起来像 3.8.2~pre1-1,小于3.8.2-1~.)
版本不按词法排序,它们按组件排序,如果可能,按数字排序,否则按词法排序。因此 3.8.10-0ubuntu1~20.04.4 确实满足这个关系:10 大于 2,所以依赖关系得到满足,比较就停止了。