![云原生应用构建:基于OpenShift](https://wfqqreader-1252317822.image.myqcloud.com/cover/173/32436173/b_32436173.jpg)
2.6 RPM打包
RPM文件有两类:源RPM(SRPM)和二进制RPM。SRPM中的有效负载是SPEC文件(描述如何构建二进制RPM)。
查看SRPM的目录结构,如图2-15所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-15.jpg?sign=1734424753-7kIDktSgdd5Pgd4O1z8MEURGv2H5L2IO-0-94b18a4575ecd5fd8f11bfac7b046ce9)
图2-15 查看SRPM目录结构
图2-15中SRPM的5个目录的作用如表2-1所示。
表2-1 SRPM目录的作用
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/b2-1.jpg?sign=1734424753-UrKtR0Xpa831R3gOE6hssN6kbMcsgt1E-0-1150da541be717ce51471b3db886b89d)
在介绍了SRPM的目录结构后,我们详细介绍SPEC的作用。
2.6.1 什么是SPEC文件
SPEC文件是rpmbuild程序用于实际构建RPM的方法。SPEC文件所包含字段的具体说明如表2-2所示。
表2-2 SPEC文件字段的含义
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/b2-2.jpg?sign=1734424753-bLuvF2PxZni0e0W0j0OIKciIjt935ZHV-0-7036e2cc5c703ef12fd33f8520a93ce1)
在运维过程中,我们经常会看到一个RPM包的Name、Version、Release。这几个字段就是在SPEC文件中定义的。例如,我们要查询Python RPM包版本,如图2-16所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-16.jpg?sign=1734424753-JxhyloJ0hF6DQO7bMDnADJkT0keZ1otZ-0-1e557150785f9a51b870223261c2aa8f)
图2-16 查看Python版本
在图2-16的输出中,python是Name,2.7.5是Version,58.el7是Release,x86_64是BuildArch。这些信息都是在SPEC中定义的。
接下来,我们介绍RPM SPEC文件中使用的语法,如表2-3所示。
表2-3 SPEC中使用的语法
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/b2-3.jpg?sign=1734424753-czVNL5WGq5oB2TAa2DcVrpYWuzkbaj3G-0-93c43ce830f4a3b62326f7f4414d44d0)
在介绍了SEPC的格式和语法后,接下来我们介绍如何书写SPEC并构建RPM包。
2.6.2 书写SPEC文件
在打包新软件时,可以通过rpmdev-newspec工具创建一个新的SPEC文件,然后据此进行修改。
首先,我们通过三个源码文件生成三个SPEC,如图2-17所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-17.jpg?sign=1734424753-MRK4F13vaHC3Nbk7ADotj626JkpBbn3H-0-0f051169df658b54bf122404a9dc2c7f)
图2-17 生成SPEC文件
SPEC已经生成,如图2-18所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-18.jpg?sign=1734424753-NyDbehtF0gFlxZ1MtYrV8TO57mWZIEhO-0-05fb7c2881ee0e894845fda2dd7d4065)
图2-18 查看生成的SPEC文件
接下来我们为三个SRPM编写SPEC,描述如表2-4所示。
表2-4 三个SRPM的SPEC
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/b2-4.jpg?sign=1734424753-sVDKHrkk0Olg6KuC0nOEinf9o9okj4t8-0-a252723135ac2ae56d4bee10cb2dfaa7)
由于三个SPEC修改的思路类似,因此只以bello为例介绍SPEC修改步骤。生成的bello.spec文件内容如下所示。
# cat bello.spec Name: bello Version: Release: 1%{?dist} Summary: License: URL: Source0: BuildRequires: Requires: %description %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT %make_install %files %doc %changelog
修改后的bello.spec内容如下所示。
[root@rpmlab-d710 ~]# cat ~/rpmbuild/SPECS/bello.spec Name: bello Version: 0.1 Release: 1%{?dist} Summary: Hello World example implemented in bash script License: GPLv3+ URL: https://www.example.com/%{name} Source0: https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz Requires: bash BuildArch: noarch %description The long-tail description for our Hello World Example implemented in bash script of DavidWei. %prep %setup -q %build %install mkdir -p %{buildroot}%{_bindir} install -m 0755 %{name} %{buildroot}%{_bindir}/%{name} %files %license LICENSE %{_bindir}/%{name} %changelog * Tue Jun 29 2019 DavidWei - 0.1-1 - First bello package - Example second item in the changelog for version-release 0.1-1
在修改完SEPC后,我们就可以根据源代码和SPEC文件构建软件包了。