【问题标题】:The right way to check if package is installed in rpm spec file检查软件包是否安装在 rpm 规范文件中的正确方法
【发布时间】:2020-06-24 12:46:38
【问题描述】:

我以前从未使用过 rpm 规范文件,所以答案很明显。我的自定义 rpm 有几个版本来简化,让它成为 1.0.0 和 2.0.0。例如,它可以在有或没有 packageA 的情况下工作,但如果 packageA 是为版本 2.0.0 安装的,它应该至少是 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
.......

在安装了 packageA-client 的系统上:

[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

这意味着找到了packageA-client,预计会出错

然后我尝试在未安装 packageA-client 的系统上运行相同的:

[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 不正确,因为找不到packageA-client。这里有什么问题,实现这样的逻辑的正确方法是什么。

【问题讨论】:

  • 这似乎倒退了。您将Requires 标签添加到确保 packageA 已安装。如果您可以在没有packageA 的情况下安装该软件包,则您没有要求。也就是说,hello-world 是否依赖于packageAnot 是否依赖于packageA 是否已经安装。您真正想在这里完成什么?
  • 如果您只是想在安装了packageA 的情况下强制安装packageA-client,那会更有意义,尽管我不确定Requires 是最好的管理方式它。如果您先安装hello-world 而没有安装packageA,然后再安装packageA,会发生什么情况?
  • @chepner 也许我真的把事情复杂化了,但我只需要做这样的事情if (packageA == installed && version == 2.2.0) 然后 packageA 应该至少为 7.0.0。关于你的第二个问题,如果安装了 hello-world 并且它的版本为 2.2.0,则应该对 packageA 执行相同的逻辑,我们不应该允许 packageA 安装低于 7.0.0。
  • 我认为Conflicts: packageA < 7.0.0 会处理这种情况,但仍然存在使packageA-client 要求依赖于packageA 存在的问题。
  • @chepner 看来我把你和命名混淆了。 packageA 与 packageA-client 相同。我只是在变量的命名中修剪client...不要像with_packageA-client那样写它谢谢你的回答我会尝试Conflicts:

标签: bash rpm rpm-spec


【解决方案1】:

Conflicts 标签可能就是您要找的:

Conflicts: packageA < 7.0.0

只有在安装了packageA 并且 早于 7.0.0 时,这才会阻止安装。此外,如果尚未安装 packageA,它不会导致安装。

我相信它还会阻止安装旧版本的packageA在安装hello-world 之后

【讨论】:

  • 是的,你说的是正确的——即使在你安装之后,如果太旧,packageA 也无法安装。
【解决方案2】:

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

然后使用版本范围在包中添加冲突指令,以避免提供的包版本号错误。

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

【讨论】:

  • 不是我投反对票,我通常会写一个投反对票的理由。
  • @NickS 谢谢,但老实说,我不认为这是你的反对意见。我根本没有想到反对票! :)
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多