我的 deb 版本不是 Debian 本地版本有关系吗?

Does it matter that my deb version is not Debian native?

为了部署我们的服务器软件,我们使用使用标准 Debian 打包脚本创建的 .deb 文件。

我们正在更改版本号。他们是 1.$SHA,例如1.b07be5a5;现在它们更加语义化,例如2.52.1+e0ce8a812.53.0-pre+0cdb5e4.dirty.

这会导致警告:

Previous package version was Debian native whilst new version is not

这是什么意思?我们应该关心吗?

是的,你应该关心。

如果您的软件包 Debian 原生的(即您为 Debian 构建它们并且软件包的版本号也是每个版本的版本号)那么您应该坚持使用版本编号保留这个的方案。

如果您的软件包不是 Debian 原生的,您应该相应地给它们编号。

Debian 软件包版本号采用通用格式

(epoch:)upstreamversion-packageversion(...fluff)

破折号很重要(纪元和尾随内容是可选的);所以 1-2 表示上游版本 12 表示这是该上游版本的第二个 Debian 软件包。

您的包版本控制方案显然使用破折号表示其他内容,与此方案不兼容,需要以某种方式进行更改以避免发生事故。具体来说,如果 -pre 之后的字符串是一个随机散列,您可能会遇到这样一种情况,即 dpkg 将较旧的散列视为较新的散列,因为 1-pre+012new 在数值上小于 1-pre+987old.

一个具体的建议是在哈希之前嵌入一个人类可读的日期和索引号,这样您就有了一个简单的方法来避免这种情况。然后 2.52.1-20191211.01~e0ce8a812.53.0-20191211.01pre+0cdb5e4.dirty 包含你想要的信息,但如果有像 2.52.1-20191211.02~adeadbeef2.53.0-20191211.02pre+000000 这样的包在同一天发布,并且恰好排序低于那些同一天的前一个包裹。

如果您的示例大致是说明性的,则纪元前缀不是强制性的,但添加它会向消费者发出一个很好的信号,表明这些版本号遵循与前一个纪元不同的约定。 (当您将编号方案从 11、12、13 切换到 1.0.15 时,您确实必须在前面添加一个纪元编号,从而导致 1:1.0.15。)如果您没有放置明确的纪元编号,隐含的纪元号为零。因此,要重复前面的示例并在前面添加纪元编号 1,您最终会得到 1:2.52.1-20191211.01~e0ce8a811:2.53.0-20191211.01pre+0cdb5e4.dirty.

建议的约定将 semver 包版本保持为 "upstream",将单个包构建为 "Debian version"。如果你想保持 Debian 原生(即没有上游,Debian 软件包版本是权威版本号),你可以省略破折号或用不同的字符替换它。

Debian 版本编号系统的详细信息记录在 Debian Policy, Section 5.6.12 Version