【问题标题】:RPM .spec how to escape preun and postun?RPM .spec 如何转义 preun 和 postun?
【发布时间】:2018-03-02 08:52:49
【问题描述】:

我已经构建了一个 package_version_1.rpm。现在我正在尝试构建一个 package_version_2.rpm。 RPM 的默认行为将删除 package_version_1.rpm 中未从 package_version_2.rpm 升级的任何文件。为了实现我想要的,我必须像这样安装包:

sudo rpm -i --nopreun --nopostun 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 '###################################################################'

任何帮助将不胜感激

【问题讨论】:

  • 很确定你不能。为什么不将新文件包含在新 RPM 中?如果您担心大小,也可以创建一个 deltarpm。
  • 感谢您的评论,很抱歉耽搁了。尺寸不完全是我的问题。

标签: rpm rpmbuild rpm-spec


【解决方案1】:

尝试的一种超级黑客方式:

  • Requires(pre): mypackage = 1.0
  • pre 脚本中:
    • mkdir -p %{_localstatedir}/lib/rpm-state/mypackage (ref)
    • 从 1.0 复制要“保留”的文件
  • posttrans 脚本中:
    • 将您想要的文件移回它们所属的位置
    • rmdir临时文件夹

注意:这很糟糕,并且会破坏一些事情(主要是验证和文件包所有权),因为您实际上是将文件放在rpm 数据库之外的位置。您还需要在两个单独的事务中安装两个软件包版本,而无法从全新的操作系统安装直接进入版本 2。

【讨论】:

  • 文件包所有权在我的情况下并不重要。关于 rpm 数据库,这是我唯一尝试不破坏的东西,否则我已经用 python 完成了复制文件等,(对我来说更容易,rpm 包对我来说是一个新故事......)无论如何你的想法需要也预装了它还不错,如果我必须手动复制/放置文件,我会尝试它。感谢您的宝贵时间。
猜你喜欢
  • 2015-07-11
  • 2020-08-03
  • 1970-01-01
  • 2014-09-07
  • 2011-08-07
  • 2021-10-29
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
相关资源
最近更新 更多