我以前从未使用过rpm规范文件,所以答案可能很明显。我的自定义 rpm 有几个版本来简化它为 1.0.0 和 2.0.0。例如,它可以与包 A 一起使用,也可以不使用包 A,但如果为版本 2.0.0 安装了包 A,则它应至少为 7.0.0。出于测试目的,我创建了hello-world.spec文件。
$cat hello.spec
[mylaptop]# cat ~/hello.spec
Name: hello-world
Version: 1
Release: 1
Summary: Most simple RPM package
License: FIXME
%define packageA_installed %(rpm -qa packageA-client)
%define version 2.2.0
%if "%packageA_installed"
%global with_packageA 1
# just for test purpose it will be deleted after testing and I will only set with_packageA
Requires: packageA-client == 1
%else
# just for test purpose it will be deleted after testing and I will only set with_packageA
Requires: packageA-client == 0
%global with_packageA 0
%endif
# I need check if packageA is installed and current rpm version 2.2.0
%if "%with_packageA" == "1" && "%{version}" == "2.2.0"
#if true - for 2.2.0 can work only with 7.0.0 and higher packageA
Requires: packageA-client >= 7.0.0
%endif
.......
在安装了包 A 客户端的系统上:
[mylaptop(with packageA-client)]# rpm -qa packageA-client
packageA-client-7.0.0-93073D.RedHat7.x86_64
[mylaptop(with packageA-client)]# rpm -i hello-world-1-1.x86_64.rpm
error: Failed dependencies:
packageA-client = 1 is needed by hello-world-1-1.x86_64
这意味着找到了包A客户端,并且预计会出现错误
然后我尝试在未安装 packageA 客户端的系统上运行相同的程序:
[mylaptop(without packageA-client)]# rpm -qa packageA-client
[mylaptop(without packageA-client)]# rpm -i ~/hello-world-1-1.x86_64.rpm
error: Failed dependencies:
packageA-client = 1 is needed by hello-world-1-1.x86_64
packageA-cllent >= 7.0.0 is needed by hello-world-1-1.x86_64
[mylaptop(without packageA-client)]#
我希望错误会packageA-client = 0 is needed by hello-world-1-1.x86_64
因为它应该进入else
条件,因为if
不是真的,因为找不到包 A 客户端。这里有什么问题,实现这样的逻辑的正确方法是什么。
Conflicts
标签可能是您要查找的内容:
Conflicts: packageA < 7.0.0
仅当安装了packageA
且早于 7.0.0 时,这将阻止安装。此外,如果尚未安装packageA
,则不会导致安装。
我相信它还会阻止在安装hello-world
后安装旧版本的packageA
。
查看是否存在包含整体功能的虚拟"提供"。 如果有,请要求它。
然后使用版本范围与包放入冲突指令,以避免版本号错误的证明包。
通过声明性地定义需求和冲突,您的逻辑将由解析程序(求解器引擎的一部分(处理 这意味着您的包不必在安装过程中运行其逻辑,并且该逻辑将在更广泛的场景中正常工作(并且在"此包中的任何内容"之外失败(