rpm 包的 %pre 部分出错时 rpm 命令的奇怪行为
Strange behaviour of rpm command on error in %pre section of a rpm package
我有一些软件包的多个版本。它的最后一个在终止安装脚本的 %pre 部分有一个错误:
mypak-0.0.1-1.el6.noarch.rpm
mypak-0.0.1-2.el6.noarch.rpm
mypak-0.0.1-3.el6.noarch.rpm <-- bad package
我所有的包在 pre
、post
、preun
和 postun
部分都有调试输出。
我安装第一个包:
rpm -Uhv mypak-0.0.1-1.el6.noarch.rpm
输出(参数是传递给脚本部分的参数)是:
Preparing... ########################################### [100%]
pre: 0.0.1-1.el6 ; param = 1
1:mypak ########################################### [100%]
post: 0.0.1-1.el6 ; param = 1
然后我尝试更新我的包并(意外地)一次启动所有包的 rpm 命令:
rpm -Uhv mypak-0.0.1-*
warning: package mypak = 0.0.1-1.el6 was already added, replacing with mypak > 0.0.1-2.el6
warning: package mypak = 0.0.1-2.el6 was already added, replacing with mypak > 0.0.1-3.el6
Preparing... ########################################### [100%]
pre: 0.0.1-3.el6 ; param = 2
!!!version 3 is bad!!!
error: %pre(mypak-0.0.1-3.el6.noarch) scriptlet failed, exit status 1
error: install: %pre scriptlet failed (2), skipping mypak-0.0.1-3.el6
preun: 0.0.1-1.el6 ; param = 0
postun: 0.0.1-1.el6 ; param = 0
如您所见,我的包裹最后被移除了。此外,即使其他包依赖于它,该包也会被删除。我什至没有收到任何关于损坏的依赖项的警告!
如果我一个接一个地安装我的软件包,我就没有这个问题。在这种情况下,第三个包的安装失败,仅此而已。我的包之前的版本还在。
我认为这确实是一种奇怪的行为。是 rpm 中的错误还是我遗漏了什么?
我在 Centos 6.5 上使用 rpm 4.8.0。
RPM 在安装时将忽略(通过替换较新版本)旧版本的同名软件包。要么重命名一些包,要么不要在同一个事务中安装同名包的多个版本
%pre 升级时的失败是棘手的。如果 %pre 失败,则不会安装较新的软件包。并且(在已安装旧版本时进行升级)将删除已安装的软件包。这里最好的答案是安装时不要依赖 %pre 打包失败。而是添加 Provides:/Requires:
以便在依赖检查期间发生包(和事务)失败,或者设计一种与 %pre 不同的方法来测试动态 属性,
无论是在配置中,还是在文档中,或者通过重命名和废弃以前的包来获得更可靠的包装。
我将此行为写到 RPM 邮件列表,Lubos Kardos 回答说这是一个错误,现在已修复。
邮件列表线程:http://lists.rpm.org/pipermail/rpm-list/2015-April/001740.html
提交:https://github.com/rpm-software-management/rpm/commit/c7fa7b2fd7205b73c833831ab9f8c311f40b2ff1
我有一些软件包的多个版本。它的最后一个在终止安装脚本的 %pre 部分有一个错误:
mypak-0.0.1-1.el6.noarch.rpm
mypak-0.0.1-2.el6.noarch.rpm
mypak-0.0.1-3.el6.noarch.rpm <-- bad package
我所有的包在 pre
、post
、preun
和 postun
部分都有调试输出。
我安装第一个包:
rpm -Uhv mypak-0.0.1-1.el6.noarch.rpm
输出(参数是传递给脚本部分的参数)是:
Preparing... ########################################### [100%]
pre: 0.0.1-1.el6 ; param = 1
1:mypak ########################################### [100%]
post: 0.0.1-1.el6 ; param = 1
然后我尝试更新我的包并(意外地)一次启动所有包的 rpm 命令:
rpm -Uhv mypak-0.0.1-*
warning: package mypak = 0.0.1-1.el6 was already added, replacing with mypak > 0.0.1-2.el6
warning: package mypak = 0.0.1-2.el6 was already added, replacing with mypak > 0.0.1-3.el6
Preparing... ########################################### [100%]
pre: 0.0.1-3.el6 ; param = 2
!!!version 3 is bad!!!
error: %pre(mypak-0.0.1-3.el6.noarch) scriptlet failed, exit status 1
error: install: %pre scriptlet failed (2), skipping mypak-0.0.1-3.el6
preun: 0.0.1-1.el6 ; param = 0
postun: 0.0.1-1.el6 ; param = 0
如您所见,我的包裹最后被移除了。此外,即使其他包依赖于它,该包也会被删除。我什至没有收到任何关于损坏的依赖项的警告!
如果我一个接一个地安装我的软件包,我就没有这个问题。在这种情况下,第三个包的安装失败,仅此而已。我的包之前的版本还在。
我认为这确实是一种奇怪的行为。是 rpm 中的错误还是我遗漏了什么?
我在 Centos 6.5 上使用 rpm 4.8.0。
RPM 在安装时将忽略(通过替换较新版本)旧版本的同名软件包。要么重命名一些包,要么不要在同一个事务中安装同名包的多个版本
%pre 升级时的失败是棘手的。如果 %pre 失败,则不会安装较新的软件包。并且(在已安装旧版本时进行升级)将删除已安装的软件包。这里最好的答案是安装时不要依赖 %pre 打包失败。而是添加 Provides:/Requires: 以便在依赖检查期间发生包(和事务)失败,或者设计一种与 %pre 不同的方法来测试动态 属性, 无论是在配置中,还是在文档中,或者通过重命名和废弃以前的包来获得更可靠的包装。
我将此行为写到 RPM 邮件列表,Lubos Kardos 回答说这是一个错误,现在已修复。
邮件列表线程:http://lists.rpm.org/pipermail/rpm-list/2015-April/001740.html
提交:https://github.com/rpm-software-management/rpm/commit/c7fa7b2fd7205b73c833831ab9f8c311f40b2ff1