![云原生应用构建:基于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=1738882097-4rDjeg1pPCyi1Kn4ACC4ESE4RhgQbthP-0-0a8248e2712d544c45d3516aa2b975b5)
图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=1738882097-DUn9eRuX9ooi29h7NY888mFJjMgjUIOw-0-09bfe4f7447230ae6c76eff9cb11a949)
在介绍了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=1738882097-pKx57vpUBgiWsEAAS1DpB1MGqbkiJHaA-0-073e2a884753a66a3d86ba856838658c)
在运维过程中,我们经常会看到一个RPM包的Name、Version、Release。这几个字段就是在SPEC文件中定义的。例如,我们要查询Python RPM包版本,如图2-16所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-16.jpg?sign=1738882097-0CpEAOp5k29Boiyb3ceO03MtiyEb3EOp-0-8f5ea53d4bb97b22289ee52f14ffe18d)
图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=1738882097-z6GyG4sNTtqChOMaTwI4WyOJlqc2qy9r-0-f7cc87dd2b3241f2b3bf3cc1a1d01862)
在介绍了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=1738882097-bhZCRWbw1AwCFp83WDfdoFOJtNqplCkw-0-f8fcfc677a3ac189f7a786038e0a5b72)
图2-17 生成SPEC文件
SPEC已经生成,如图2-18所示。
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/t2-18.jpg?sign=1738882097-mFBnREwa9n20eFrXZ8pkbrLXVKhZAavk-0-3fd46810cb8073fba453ba980b055b1d)
图2-18 查看生成的SPEC文件
接下来我们为三个SRPM编写SPEC,描述如表2-4所示。
表2-4 三个SRPM的SPEC
![](https://epubservercos.yuewen.com/20751C/17517094506695406/epubprivate/OEBPS/Images/b2-4.jpg?sign=1738882097-Wl7IxPlAd7GFySC8iApixIs0douRAjG6-0-0f84dd85449dae0f6793cb379fdc2a30)
由于三个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文件构建软件包了。