我遇到了这个问题,我想了解为什么会这样。我构建了 3 个非常简单的 rpm 包,分别称为 a、b 和 c,并且我创建了一个独立的包,b 依赖于 a,而 c 依赖于 a 和 b。它们每个都有一个仅由一个文件组成的源,该文件应该放在 /home/ 中(这不是重点)。
它们每个的代码或多或少都相同,只是依赖项从一个包变为另一个包。我在工作中测试过其他包,其中的依赖项是这样组织的。有时一个包失败了,但总是会安装下一个包,即使依赖包失败了。
这是我的测试代码,我尝试让 b 包失败:
Name: b
Version: 1
Release: 1%{?dist}
Summary: Package b
License: GPL
Source0: b.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
PreReq: a
%description
Install package b
%prep
%setup -q
%pre
if [ ! -f "/home/b" ]
then
exit 1
fi
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/home/
mv b %{buildroot}/home/
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
/home/b
因此,您可能会注意到,这个包总是会失败,但这就是它的目的。当我尝试安装包时,我得到了这个:
[root@oradm|in ~]# rpm -ivh a-1-1.el6.x86_64.rpm b-1-1.el6.x86_64.rpm c-1-1.el6.x86_64.rpm
Préparation... ########################################### [100%]
1:a ########################################### [ 33%]
erreur: %pre(b-1-1.el6.x86_64) scriptlet failed, exit status 1
erreur: install: échec du scriptlet %pre (2), on saute b-1-1.el6
2:c ########################################### [ 67%]
因此,软件包 a 正在安装,这很合理,没有任何问题。然后软件包 b 按照预期失败。但是软件包 c 也安装了!这应该会失败,因为这是软件包 c 的代码:
Name: c
Version: 1
Release: 1%{?dist}
Summary: Package c
License: GPL
Source0: c.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
PreReq: a,b
%description
Install package c
%prep
%setup -q
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/home/
mv c %{buildroot}/home/
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
/home/c
如您所见,它应该需要 a 和 b,但 b 失败了。这怎么可能呢?我尝试使用“Requires”指令代替 PreReq,结果完全相同。
谁可以给我解释一下这个 ?
编辑:我忘了补充,我在安装 rpm 包的服务器上使用的是 RPM 版本 4.8.0,它是 RHEL 6.3