为什么包名称包含版本号?

为什么包名称包含版本号?

在使用 Ubuntu 和其他基于 Debian 的发行版时,我注意到软件存储库中的软件包通常包含主版本号。

例如,

  • 阿帕奇:apache2
  • 雄猫:tomcat7
  • PHP:php5
  • 葡萄酒:wine1.4
  • MySQL:mysql-server-5.5

但我注意到没有apache1可用的软件包,其余的也类似。如果软件包的名称随着软件的更新而改变,这是否会妨碍软件包管理的主要目标之一(轻松升级)?

apache3如果 Apache 3 明天发布,如果我想升级,我是否必须手动安装该软件包?

答案1

包的命名方式类似于需要(或曾经)简化包的两个主要版本之间的转换,并且这样做所需的时间预计会很长。在过渡期间,新旧版本均保持可用,但在未来某个时间旧版本将停止使用。

有时,过渡期发生在您当前使用的系统版本期间。对于某些软件包,这种情况经常发生,您可以期望在以下位置看到过渡软件包版本:每一个新系统发布。软件开发工具通常属于这一类,因为按照与系统发布相同的时间表升级到新工具可能不切实际。我的公司对 GCC、Autoconf 和 Perl 特定版本的依赖可能以 5 年为一个周期,而我的操作系统可能以 3 年为一个升级周期。因此,如果新操作系统除了开发新操作系统时当前的内容之外还包含我的某些软件包的旧版本,那么我就可以更轻松地采用新操作系统。

其他时候,这些重大版本更改很久以前就发生了,过去了,现在每个人都在使用当前版本。例如,Apache 就是这种情况。从兼容性的角度来看,1.3 到 2.0 的变化比任何 2.x 版本的变化都要大得多,因此一旦每个人都放弃 1.3,就不再需要在给定的操作系统版本中继续提供多个 Apache 版本。但是,一旦每个人都使用该apache2包,就没有很好的理由将其重命名回apache.这会导致不必要的升级麻烦。此外,如果过去认为需要暂时提供两个并行版本,那么将来可能会再次出现这种需要。

这种包命名实践通常仅发生在库或重要的核心包中。对于更多外围软件包,您只需升级到当前的任何软件包即可。

与应用程序相比,库更常以这种方式处理,因为就其本质而言,其他包依赖于它们。库越受欢迎,要求依赖于它的所有其他包都被重建并重新链接到它,以便库可以在没有这个过渡期的情况下逐步升级到新的主要版本,就越不切实际。

通常,当应用程序以这种方式处理时,这是因为它包含库元素。例如,Apache不仅仅是一个Web服务器,它还为插件提供了开发API。 (mod_foo等等。)如果有人有一个mod_something针对 Apache 1.3 插件 ABI 的旧链接,并且尚未将其升级为使用较新的 2.0 API,那么如果您的操作系统继续提供旧的 Apache 1.3,直到所有插件创建者都有机会,这会很方便更新他们的插件。

答案2

据我观察,造成这种情况的原因有:

  • 帮助主要版本的软件包迁移:当 PHP 5 发布时,可能需要安装 PHP 4。这允许人们在版本之间进行选择(至少在旧版本过时之前)。

  • 继续为旧版本的软件提供更新(例如,在 Apache 3 发布后,可能需要修补 Apache 2),而不将其升级到较新的主要版本。

例如,Linux 内核(截至今天)有稳定版本3.5、3.4.7、3.2.24、2.6.35.13 等...如果您在系统上运行 2.6.35 并且希望使其保持最新,但是不是升级这个内核,就可以安装足够的软件包了。

相关内容