Red Hat Training

A Red Hat training course is available for RHEL 8

6.2. 支持布尔值依赖项

从版本 4.13 开始,RPM 可以在以下依赖关系中处理布尔表达式:

  • Requires
  • 建议
  • 推荐
  • 补充
  • 加强
  • Conflicts

以下小节描述了 布尔值依赖项语法,它提供了 布尔值运算符 的列表,并解释了 布尔值依赖项嵌套 以及 布尔值依赖项语义

6.2.1. 布尔值依赖关系语法

布尔表达式始终用括号括起。

它们不是普通依赖项的构建:

  • 只使用名称或名称
  • 比较
  • 版本描述

6.2.2. 布尔值运算符

RPM 4.13 引入了以下布尔值运算符:

表 6.2. RPM 4.13 中引入的布尔值 operator

布尔值运算符描述使用示例

需要满足所有操作对象,才能实现这一术语。

冲突:(pkgA 和 pkgB)

或者

需要满足其中一个操作对象,才能使术语变为 true。

Requires:(pkgA >= 3.2 或 pkgB)

if

如果第二个对象需要满足第一个操作对象。(覆盖)

建议(myPkg-langCZ,如果 langsupportCZ)

如果出现其他情况

if operator 相同,如果第二个操作不是,则要求完成第三个操作对象。

Requires:如果 mariaDB 其他 sqlite,则 myPkg-backend-mariaDB

RPM 4.14 引入了以下额外布尔值运算符:

表 6.3. RPM 4.14 中引入的布尔值运算符

布尔值运算符描述使用示例

with

需要同一软件包实现所有操作对象才能使术语为 true。

Requires:(pkgA-foo with pkgA-bar)

without

需要一个满足第一个操作对象但不能满足第二个操作(设置的减法)的单个软件包

Requires:(pkgA-foo without pkgA-bar)

unless

如果第二个对象不是,则需要达到第一个操作对象。(覆盖了负数表示)

Conflicts: (myPkg-driverA unless driverB)

除非另有

与 unless 运算符 相同,另外,如果第二个操作就会达到第三个操作数。

冲突:(myPkg-backend-SDL1, unless myPkg-backend-SDL2 else SDL2)

重要

if operator 无法与 运算在同一上下文中使用,除非 运算符无法用于

6.2.3. 嵌套

操作对象本身可用作布尔值表达式,如下例所示。

请注意,在这种情况下,操作对象也需要由圆括号包围起来。您可以将 运算符串联在一起,使同一运算符只与一个周围的括号一起重复。

例 6.2. 将操作对象用作布尔值表达式的示例

Requires: (pkgA or pkgB or pkgC)
Requires: (pkgA or (pkgB and pkgC))
Supplements: (foo and (lang-support-cz or lang-support-all))
Requires: (pkgA with capB) or (pkgB without capA)
Supplements: ((driverA and driverA-tools) unless driverB)
Recommends: myPkg-langCZ and (font1-langCZ or font2-langCZ) if langsupportCZ

6.2.4. 语义

使用 布尔值依赖项 不会更改常规依赖项的语义。

如果使用 布尔值依赖项,则检查所有名称与所有名称匹配的布尔值,并且有匹配项的布尔值则会被聚合在布尔值运算符上。

重要

对于除 Conflicts: 之外的所有依赖项,结果必须是 True 才可以阻止安装。对于 Conflicts:,结果必须是 False 不可阻止安装。

警告

提供 不是依赖项,不能包含布尔值表达式。

6.2.5. 了解 if operator 的输出

如果 Operator 也返回布尔值,这通常接近直观的理解。然而,以下示例显示,在某些情况下直观理解,如果 具有误导。

例 6.3. if operator 误导输出

如果没有安装 pkgB,则此语句为 true。但是,如果使用此语句时,默认结果为 false,则情况会变得复杂:

Requires: (pkgA if pkgB)

除非安装了 pkgB,且 pkgA 没有被安装,否则此声明会发生冲突:

Conflicts: (pkgA if pkgB)

因此,您可能要使用:

Conflicts: (pkgA and pkgB)

如果 if 运算符嵌套在 or 术语中,则同样如此:

Requires: ((pkgA if pkgB) or pkgC or pkg)

这也可使整个术语为 true,因为如果 pkgB 尚未安装 pkgB,if term为 true。如果 pkgB 只是安装 pkgB 时的帮助,请使用

Requires: ((pkgA and pkgB) or pkgC or pkg)