【发布时间】: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是否依赖于packageA,not 是否依赖于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: