我已经构建了一个package_version_1.rpm。现在我试图建立一个package_version_2.rpm。 RPM的默认行为将从package_version_1.rpm中删除未从package_version_2.rpm升级的package_version_1.rpm中的任何文件。要实现我想要的,我必须安装这样的包:
sudo rpm -i --nopreun - 下载package_version_2.rpm
但这不是我想要的。我正在寻找一个解决方案来逃避.spec文件内的preun和postun。
经过一些研究之后(并且几乎所有在stackoverflow中都有关键字“RPM .spec preun postun”的帖子):
http://meinit.nl/rpm-spec-prepostpreunpostun-argument-values https://www.ibm.com/developerworks/library/l-rpm2/
我发现使用该命令:rpm --showrc打印出所有宏。我将它们导出到txt文件以便于搜索,我尝试进行实验。我在preun和postun创建案例,我试图找到一个解决方案,以便在升级时禁用preun和postun。我尝试了所有可能的想法,但我没有运气。
在案例部分,您可以看到我的一些尝试......
%define debug_package %{nil}
%global _python_bytecompile_errors_terminate_build 0
%define _binaries_in_noarch_packages_terminate_build 0
%preun
# this runs before remove the package
echo '###################################################################'
echo 'Run preun package_version_1.rpm'
case "$1" in
0)
echo 'case 0 preun'
# This is an uninstallation.
;;
1)
# %systemd_postun %{nil}
# systemd_user_preun %{nil}
echo 'case 1 preun'
# systemctl --nopreun
exit 0
;;
esac
echo '###################################################################'
%postun
# this runs after the package has be removed
echo '###################################################################'
echo 'Run postun package_version_1.rpm'
case "$1" in
0)
echo 'case 0 postun'
# This is an uninstallation.
;;
1)
# %systemd_postun %{nil}
# systemd_user_postun %{nil}
echo 'case 1 postun'
# systemctl --nopostun
exit 0
;;
esac
echo '###################################################################'
任何帮助将不胜感激
一种超级黑客的尝试方式:
Requires(pre)
:mypackage = 1.0pre
scriptlet中:
mkdir -p %{_localstatedir}/lib/rpm-state/mypackage
(ref)
复制要从1.0“保持”的文件posttrans
scriptlet中:
将您想要的文件移回其所属的位置
rmdir
临时文件夹注意:这很糟糕,会破坏一些事情(主要是验证和文件包所有权),因为您实际上是在rpm
数据库之外放置文件。您还需要在两个单独的事务中安装两个软件包版本,而无法从全新的OS安装直接进入版本2。