如何在以下位置执行脚本%pre, %post, %preun or %postun 安装/升级rpm时的阶段(规格文件)

spec各个阶段说明

序言部分

Name 姓名

名称行定义了包的实际名称。一般来说,使用软件的名称是个好主意。名称也将包含在包标签和包文件名中。

Version 版本

版本行应该设置为正在打包的软件的版本。版本也将包含在包标签和包文件名中。

Release 发布

发行版是一个数字,用来表示软件在当前版本中被打包的次数。您可以将其看作是包的版本号。发布也是包标签和包文件名的一部分。

License 许可证

许可线用于保存打包软件的许可信息。这使得很容易确定哪些包可以免费重新分发,哪些不可以。在我们的例子中,cdplayer 是根据 GNU通用公共许可协议协议的条款提供的,所以我们已经把 GPL 放在一边了。

Group 组别

分组行用于保存一个字符串,该字符串定义如何将打包软件与其他软件包进行分组。字符串由一系列由斜杠分隔的单词组成。从左到右,这些词更加明确地描述了打包软件。我们将 cdplayer 分组在 Applications 下,因为它是一个应用程序,然后在 Sound 下,因为它是一个与声音相关的应用程序。

Source

源代码行有两个用途::

  • 记录在哪里可以找到打包软件的源。
  • 给出源文件在 SOURCES 子目录中的名称。

URL 网址

URL 行用于包含一个 URL,如源代码行。它们有什么不同?虽然源代码行用于提供 RPM 的源文件名,但 URL 行指向正在打包的软件的文档。

Distribution 分布

分销线包含产品的名称,打包的软件是其中的一部分。在 Linux 世界中,操作系统通常被打包成一个“发行版” ,因此得名。由于我们在本例中使用了一个虚构的应用程序,因此我们在发行行中填充了一个虚构发行版的名称。没有要求 spec 文件包含一个分发行,所以个人可能会忽略这一点。

Vendor 卖主

供应商系列标识分发软件的组织。为了保持我们的虚构主题,我们虚构了一家公司,White Socks Software,添加到我们的规范文件中。个人可能也会忽略这一点。

Packager 包装者

打包者行用于标识实际打包软件的组织,而不是软件的作者。在我们的示例中,我们选择了他们中最伟大的包装者——圣诞老人——来为 White Socks Software 工作。请注意,我们已经以电子邮件地址的形式包含了联系信息。

Description 描述

描述行有点不同,因为它以百分号开头。这也是不同的,因为信息可以占用一行以上。与摘要行相比,它用于提供对打包软件更详细的描述。


#
# Example spec file for cdplayer app...
#
Summary: A CD player app that rocks!
Name: cdplayer
Version: 1.0
Release: 1
License: GPL
Group: Applications/Sound
Source: ftp://ftp.gnomovision.com/pub/cdplayer/cdplayer-1.0.tgz
URL: http://www.gnomovision.com/cdplayer/cdplayer.html
Distribution: WSS Linux
Vendor: White Socks Software, Inc.
Packager: Santa Claus <sclaus@northpole.com>

%description
It slices!  It dices!  It's a CD player app that
can't be beat.  By using the resonant frequency
of the CD itself, it is able to simulate 20X
oversampling.  This leads to sound quality that
cannot be equaled with more mundane software...

构建rpm

如果 执行设置某个包的操作,在各个阶段上设置包名即可。

%package: test
%build test
%files test

创建了软件的构建环境

prep

在% prep 部分创建了软件的构建环境,从移除之前任何构建的残余开始。在此之后,将扩展源归档文件。下面是% prep 部分在我们的示例规范文件中的样子:


%prep
rm -rf $RPM_BUILD_DIR/cdplayer-1.0
zcat $RPM_SOURCE_DIR/cdplayer-1.0.tgz | tar -xvf -

如果% prep 部分看起来像一个脚本,那是因为它就是。这里可以使用任何 sh 结构,包括环境变量的展开(比如由 RPM 定义的 $RPM _ build _ dir 变量) ,以及通过 tar 管道输出 zcat 的输出。[1]

通常情况下,为了正确构建,源代码可能需要修补。% prep 部分是修补源代码的适当位置,但是在本例中不需要修补。然而,不要害怕,我们将在第20章中探讨如何修补它的所有荣耀,当我们构建一个更复杂的包时。

package

虽然到目前为止我们已经看到的每个指令都在 %files列表中使用,但%package 指令却不同。它用于允许每个规格文件创建多个软件包,并且可以在规格文件的任何位置出现。这些其他程序包称为子程序包。根据包含%package指令的行的内容来命名子 包。package指令的格式为:

%package: <string>

build

毫不奇怪,spec 文件中负责执行构建的部分是% build 部分。与% prep 部分一样,% build 部分也是一个普通的 sh 脚本。与% prep 部分不同,这里没有宏。原因是构建软件的过程要么非常简单,要么非常复杂。无论哪种情况,宏都不会有太大帮助。在我们的例子中,构建过程很简单:

%build
make 

install

% install 部分作为 sh 脚本执行,就像% prep 和% build 一样。如果应用程序是使用 make 构建的,并且有一个“ install”目标,那么% install 部分也将非常简单。应用程序就是一个很好的例子:

%install
make install

files

% files 部分与其他部分不同,因为它包含作为包一部分的文件的列表。永远记住ーー如果它不在文件列表中,它就不会被放到包中!


%files
%doc README
/usr/local/bin/cdp
/usr/local/bin/cdplay
/usr/local/man/man1/cdp.1

doc

以% doc 开头的行是 RPM 处理不同文件类型的示例。正如您可能猜到的,% doc 代表文档。% doc 指令用于将文件标记为文档。在上面的示例中,README 文件将放在特定于包的目录中,位于/usr/doc 中,称为 cdplayer-1.0-1。还可以将文件标记为文档,并将其安装在其他目录中。这在第13章的% doc 指令部分有更详细的介绍。

clean

另一个缺少的部分有一个相当描述性的标题% clean。此部分可用于清除不属于应用程序正常生成区域的任何文件。例如,如果应用程序在/tmp 中创建一个目录结构作为其构建的一部分,则不会删除它。通过向% clean 部分添加一个 sh 脚本,可以在创建二进制包之后正常地处理这种情况。

构建多个rpm

spec脚本 rpm

RPM规范文件有几个部分,这些部分允许软件包在安装和删除时运行代码。这些代码位称为scriptlet,主要用于用软件包中的信息更新正在运行的系统。

调用脚本时,将为它们提供一个参数。通过$1(对于shell脚本)访问的此参数是该名称的软件包的数目,该数目将在操作完成时保留在系统上

所有脚本必须以0退出状态退出。

%pre%post中的scriptlet分别在安装软件包之前和之后运行。脚本%preun%postun在软件包卸载之前和之后运行。脚本%pretrans%posttrans在事务的开始和结束时运行。
升级时,脚本按以下顺序运行:

  1. 新包装的%pre(软件包安装)
  2. 新包装的%post
  3. 旧包的%preun(去除旧包装)
  4. 旧软件包的%postun
    我创建了两个具有两个不同版本的rpm,在规范文件中具有以下内容:
%pre
echo “————-“
echo “This is pre”
echo “Install Value: $1echo “Upgrade Value: $1echo “Uninstall Value: $1echo “————-“
%post
echo “————-“
echo “This is post”
echo “Install Value: $1echo “Upgrade Value: $1echo “Uninstall Value: $1echo “————-“

%preun
echo “————-“
echo “This is preun”
echo “Install Value: $1echo “Upgrade Value: $1echo “Uninstall Value: $1echo “————-“

%postun
echo “————-“
echo “This is postun”
echo “Install Value: $1echo “Upgrade Value: $1echo “Uninstall Value: $1echo “————-“

安装rpm

以下是安装rpm时的片段:

# rpm -ivh /tmp/rpmbuild/RPMS/x86_64/deepak-1.0.0-1.x86_64.rpm
Preparing…                          ################################# [100%]
————-
This is pre
Install Value: 1
Upgrade Value: 1
Uninstall Value: 1
————-
Updating / installing…
   1:deepak-1.0.0-1                   ################################# [100%]
————-
This is post
Install Value: 1
Upgrade Value: 1
Uninstall Value: 1
————-

升级rpm

# rpm -Uvh /tmp/rpmbuild/RPMS/x86_64/deepak-2.0.0-1.x86_64.rpm
Preparing…                          ################################# [100%]
————-
This is pre
Install Value: 2
Upgrade Value: 2
Uninstall Value: 2
————-
Updating / installing…
   1:deepak-2.0.0-1                   ################################# [ 50%]
————-
This is post
Install Value: 2
Upgrade Value: 2
Uninstall Value: 2
————-
————-
This is preun
Install Value: 1
Upgrade Value: 1
Uninstall Value: 1
————-
Cleaning up / removing…
   2:deepak-1.0.0-1                   ################################# [100%]
————-
This is postun
Install Value: 1
Upgrade Value: 1
Uninstall Value: 1
————-

删除rpm

# rpm -e deepak
————-
This is preun
Install Value: 0
Upgrade Value: 0
Uninstall Value: 0
————-
————-
This is postun
Install Value: 0
Upgrade Value: 0
Uninstall Value: 0
————-

如您所见,现在有了必须使用的Scriplets值。以下是合并的输出
在这里插入图片描述
因此,让我们使用它们来添加一些脚本

最终规格文件

最终规格文件的时间。在这里用要执行的脚本内容替换相应的空间
我已根据要执行的操作突出显示了打印语句。您可以替换这些打印语句,并相应地放置脚本。

%pre
if [ $1 == 1 ];then
   echo “———————–“
   echo “RPM is getting installed”
   echo “Put your script here”
   echo “———————–“
elif [ $1 == 2 ];then
   echo “———————–“
   echo “RPM is getting upgraded”
   echo “Put your script here”
   echo “———————–“
fi
%post
if [ $1 == 1 ];then
   echo “———————–“
   echo “RPM is getting installed”
   echo “Put your script here”
   echo “———————–“
elif [ $1 == 2 ];then
   echo “———————–“
   echo “RPM is getting upgraded”
   echo “Put your script here”
   echo “———————–“
fi

%preun
if [ $1 == 1 ];then
   echo “———————–“
   echo “RPM is getting upgraded”
   echo “Put your script here which will be called when this rpm is removed”
   echo “———————–“
elif [ $1 == 0 ];then
   echo “——————–“
   echo “RPM is getting removed/uninstalled”
   echo “Put your script here which will be called before uninstallation of this rpm”
   echo “——————–“
fi

%postun
if [ $1 == 1 ];then
   echo “———————–“
   echo “RPM is getting upgraded”
   echo “Put your script here which will be called when this rpm is removed”
   echo “———————–“
elif [ $1 == 0 ];then
   echo “——————–“
   echo “RPM is getting removed/uninstalled”
   echo “Put your script here which will be called after uninstallation of this rpm”
   echo “——————–“
fi

安装rpm

# rpm -ivh ../RPMS/x86_64/deepak-1.0.0-1.x86_64.rpm
Preparing…                          ################################# [100%]
———————–
RPM is getting installed
Put your script here
———————–
Updating / installing…
   1:deepak-1.0.0-1                   ################################# [100%]
———————–
RPM is getting installed
Put your script here
———————–

升级rpm

# rpm -Uvh ../RPMS/x86_64/deepak-2.0.0-1.x86_64.rpm
Preparing…                          ################################# [100%]
———————–
RPM is getting upgraded
Put your script here
———————–
Updating / installing…
   1:deepak-2.0.0-1                   ################################# [ 50%]
———————–
RPM is getting upgraded
Put your script here
———————–
———————–
RPM is getting upgraded
Put your script here which will be called when this rpm is removed
———————–
Cleaning up / removing…
   2:deepak-1.0.0-1                   ################################# [100%]
———————–
RPM is getting upgraded
Put your script here which will be called when this rpm is removed
———————–

卸载rpm

# rpm -e deepak
——————–
RPM is getting removed/uninstalled
Put your script here which will be called before uninstallation of this rpm
——————–
——————–
RPM is getting removed/uninstalled
Put your script here which will be called after uninstallation of this rpm
——————–

我希望这篇文章有用。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山羊哥-老宋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值