检查软件包是否安装在 rpm 规范文件中的正确方法



我以前从未使用过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

查看是否存在包含整体功能的虚拟"提供"。 如果有,请要求它。

然后使用版本范围与包放入冲突指令,以避免版本号错误的证明包。

通过声明性地定义需求和冲突,您的逻辑将由解析程序(求解器引擎的一部分(处理 这意味着您的包不必在安装过程中运行其逻辑,并且该逻辑将在更广泛的场景中正常工作(并且在"此包中的任何内容"之外失败(

最新更新