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) |
| 如果第二个对象需要满足第一个操作对象。(覆盖) | 建议(myPkg-langCZ,如果 langsupportCZ) |
|
与 | Requires:如果 mariaDB 其他 sqlite,则 myPkg-backend-mariaDB |
RPM 4.14 引入了以下额外布尔值运算符:
表 6.3. RPM 4.14 中引入的布尔值运算符
布尔值运算符 | 描述 | 使用示例 |
---|---|---|
| 需要同一软件包实现所有操作对象才能使术语为 true。 | Requires:(pkgA-foo with pkgA-bar) |
| 需要一个满足第一个操作对象但不能满足第二个操作(设置的减法)的单个软件包 | Requires:(pkgA-foo without pkgA-bar) |
| 如果第二个对象不是,则需要达到第一个操作对象。(覆盖了负数表示) | 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)