![云原生应用构建:基于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=1738918365-ZWAlpKdDSpj1EbHhLxAadTSuKdzjj6s0-0-bc92c47c1543a85855d26c6bed1abe48)
图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=1738918365-Q8xHFADsnouIX4WRkVMo8pAlsJQoBpOx-0-3770bae170517f096e8ea2efa0d6f5bd)
在介绍了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=1738918365-G5Bpjtl7oFBi8CRVkhtGcEsrY43j0saQ-0-fb14e419bdff957431c526de69511dfd)
在运维过程中,我们经常会看到一个RPM包的Name、Version、Release。这几个字段就是在SPEC文件中定义的。例如,我们要查询Python RPM包版本,如图2-16所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-16.jpg?sign=1738918365-bMKxhoWxKt8mthAkjOKRhs9JDQMNcCsM-0-69569f4b860abb5000ffbec57bab4892)
图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=1738918365-3NVdvVgWczSOr3t2ztbPyY9rFsOSfufF-0-6f22759dc0fa103896f45413dc7390a4)
在介绍了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=1738918365-Rkn0hNO4LoZPRpdPvvLDQIOA3YqTvrS7-0-e05fbcefede6a35deae952d8abde48b8)
图2-17 生成SPEC文件
SPEC已经生成,如图2-18所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-18.jpg?sign=1738918365-HnUIbP2ReAbqpQDiJYvY5EavYqTU3eRq-0-c467673b030a44b9a619f94ba9d24fe9)
图2-18 查看生成的SPEC文件
接下来我们为三个SRPM编写SPEC,描述如表2-4所示。
表2-4 三个SRPM的SPEC
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/b2-4.jpg?sign=1738918365-bsAsn0TWcfykxqi13gY7aUJ2ix3QdhP1-0-d405f33fa29ed6c4db5db487e8337f9a)
由于三个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文件构建软件包了。