Rpm在spec文件中降级脚本

时间:2014-05-07 13:14:41

标签: rpm rpmbuild rpm-spec

我在rpm的%post脚本中创建一些文件,如下所示

- 规范文件版本1.1 -

%post
  echo %{version} `date` > /var/info

以上脚本不存在旧rpm(即版本< = 1.0)。安装新的(版本1.1)rpm时创建/ var / info文件

我按照以下方式降级包

rpm -Uvh --oldpackage myrpm-1.0.rpm

我希望在降级rpm时删除/ var / info文件。

如果我包含以下脚本,则在卸载时删除文件但不升级。 --- spec文件---

 %postun
    if [ $1 =="0" ]
       rm /var/info
    fi

如果我降级到版本<可以帮我删除文件吗? 1.1

2 个答案:

答案 0 :(得分:2)

我认为1.1规范中的以下%triggerin scriptlet可以在降级为1.0时删除/var/info

%triggerin -- %{name} < 1.1
rm /var/info

但RPM也会在升级到1.1时触发此%triggerin。有关详细信息,请参阅下文:

更新:我已经为解决方法编写了RPM宏:

答案 1 :(得分:1)

我不相信你只能使用scriptlet来做到这一点。据说使用scriptlet创建这样的文件是一个坏主意(正是出于这种原因)。

你想要的是:

  

The %ghost Directive

     

正如我们在名为%文件列表的部分中提到的,如果文件是   在%files列表中指定,该文件将自动包含在内   在包中。有时候文件应该由。拥有   包但未安装 - 日志文件和状态文件都很好   您可能希望这种情况发生的案例。

     

实现这一目标的方法是使用%ghost指令。通过增加   这个指令到包含文件的行,RPM就会知道了   ghosted文件,但不会将其添加到包中。然而它仍然   需要在buildroot中。这是%ghost中的一个例子。

     

blather-1.0软件包默认登录到/var/log/blather.log   配置。在spec文件中,包含/var/log/blather.log文件   %文件列表。我们可以看到blather.log属于包,   并且在包装时将其删除。

     

%安装
  触摸$ RPM_BUILD_ROOT%{_ localstatedir} /log/blather.log
  ...
  %文件
  ...
  %ghost%{_ localstatedir} /log/blather.log
  ...
  #rpm -qf /var/log/blather.log
  废话,1.0-1
  #rpm -ql blather | grep blather.log
  
  #rpm -e blather&amp;&amp; ls /var/log/blather.log
  ls:/var/log/blather.log:没有这样的文件或目录

     

在%install阶段触及的文件将不会安装到   /var/log/blather.log虽然它会被添加到rpm数据库中,因为   我们可以从查询文件中看到,但是从a中看不到它   包列表,但由于它是包所拥有的,它将被删除   当包被删除。此外,它可以使用   setperms修复%ghost文件的权限。

     

#ls -al /var/log/blather.log
  -rw-r - r-- 1 root root 3448 Jun 18 17:00 /var/log/blather.log
  #chmod 666 /var/log/blather.log
  #ls -al /var/log/blather.log
  -rw-rw-rw- 1 root root 3448 Jun 18 17:00 /var/log/blather.log
  #rpm --setperms blather
  #ls -al /var/log/blather.log
  -rw-r - r-- 1 root root 3448 Jun 18 17:00 /var/log/blather.log