管理应用程序流内容的版本

AppStream 仓库中的内容可以有多个版本,对应于模块流。本部分介绍了以其他方式(不是仅启用新模块流)更改启用的模块流时需要执行的操作。

模块依赖和流更改

传统上,提供内容的软件包依赖于其他软件包,并且通常指定所需的依赖项版本。对于模块中包含的软件包,也适用此机制,但是将软件包及其特定版本分组到模块和流中会提供进一步的约束。此外,模块流可以声明对其他模块流的依赖关系,独立于它们包含和提供的包。

在对包或模块进行任何操作之后,所有底层安装包的整个依赖关系树必须满足包声明的所有条件。此外,必须满足所有模块流依赖关系。

因此:

  • 启用一个模块流可能需要启用其他模块流。

  • 安装一个模块流配置文件或从一个流安装软件包可能需要启用更多模块流和安装更多软件包。

  • 禁用一个模块流可能需要禁用其他模块流。不会自动删除任何包。

  • 删除一个软件包可能需要删除其他软件包。如果这些软件包是由模块提供的,则即使不再安装这些流中的软件包,模块流也将保持启用状态,以准备进一步安装。这反映了未使用的 yum 仓库的行为。

如果已启用同一模块的另一个流,则无法启用该模块的其他流。要切换流,必须首先重置模块,然后启用新的流。强烈建议在切换到其他流之前从流中删除所有已安装的软件包,因为这样可以防止系统进入在没有仓库或流提供的情况下安装包的状态。

从技术上讲,重置模块不会自动更改任何已安装的软件包。删除前一个流提供的包以及依赖它们的任何包都是需要明确的手动操作。

模块依赖和非模块依赖

模块依赖 是在常规 RPM 依赖之上的附加层。模块依赖关系的行为类似于存储库之间假设的依赖关系。这意味着,安装不同的软件包不仅需要解析 RPM 依赖关系,而且必须预先解析模块依赖关系。

系统将始终保留模块和流选择,除非明确指示更改它们。模块化软件包将接收当前启用的提供此软件包的模块流中包含的更新,但不会升级到其他流中包含的版本。

重置模块流

重置模块是将其所有流返回到其初始状态的操作 —— 既不启用也不禁用。如果模块有一个默认流,则该流将由于重置模块而变为激活流。

步骤
  • 重置模块状态:

    # yum module reset module-name

    模块的所有流都返回到初始状态。未删除安装的内容。

禁用模块的所有流

具有默认流的模块将始终有一个流处于激活状态。要使所有模块流的内容都不能被访问,可以禁用整个模块。

前提
步骤
  • 禁用模块:

    # yum module disable module-name

    yum 请求确认,然后禁用模块及其所有流。所有模块流都变为非激活状态。未删除安装的内容。

切换到更高版本流

当您切换到更高版本的模块流时,该模块中的所有软件包都将替换为它们的更高版本。

此过程仅在下述条件下可行。

前提
  • 系统已完全更新。

  • 系统上安装的软件包均不比仓库中可用的软件包更新。

步骤
  1. 运行以下命令以确定您的系统是否准备好切换到更高版本的流:

    # yum distro-sync

    此命令必须以消息 Nothing to do. Complete! 结束。如果它提出更改并要求确认,则拒绝这些更改并将系统修改为命令完成而不需要进一步操作的状态。

    通过在切换流之前检查 yum distro-sync 结果,可以防止对系统进行与流切换无关的更改,因为此过程的最后一步需要相同的命令。

  2. 将激活流更改为较新的流:

    # yum module reset module-name
    # yum module enable module-name:new-stream
  3. 同步已安装的软件包以在流之间执行更改:

    # yum distro-sync

    如果此操作建议更改流以外的内容,请仔细检查它们。

    如果某些已安装的软件包依赖于较低版本的流,而在较高版本的流中没有兼容的版本,则 yum 将报告依赖冲突。在这种情况下,请使用 --allowerasing 选项删除此类软件包,因为缺少依赖,它们无法与更高版本的流一起安装。

    在切换 Perl 模块时,始终需要 --allowerasing 选项,因为在基础 Circle Linux 8 安装中某些包依赖于 Perl 5.26

或者,从当前流中删除所有安装的模块内容,重置模块,然后安装新的流。