手把手教你搞定RPM安装包制作

2,377 阅读2分钟

准备工作

为了更好的理解这个教程,请提前做好如下准备

  • centos7或rhel7

$ yum install gcc rpm-build rpm-devel rpmlint make python bash coreutils diffutils patch rpmdevtools

RPM是什么

RPM是一种运用在红帽系Linux系统(Red Hat Enterprise Linux,CentOS和Fedora)的软件包管理系统。RPM简化了在红帽系Linux系统(信创专用计算机也支持)的软件分发管理。

创建工作目录

在完成准备工作后,接着就可以调用rpmdev-setuptree命令,然后就可以在~目录下生成一个rpmbuild目录。具体目录结构如下

$ rpmdev-setuptree

$ tree ~/rpmbuild/
/home/user/rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS

5 directories, 0 files
目录名用途备注
BUILD%_builddir代表的目录
RPMS二进制安装包输出的目录,不同架构的系统会生成不同的二级目录noarch,x86_64
SOURCES待打包的源码或者二进制文件的目录
SPECS打包描述文件SPEC的目录
SRPMS带源码的rpm包输出目录

创建一个打包项目

创建spec文件

SPEC文件是用来描述打包过程的文件,通过rpmdev-newspec可以创建一个模版,然后我们基于这个模版来进行修改。

[root@worker01 SPECS]# rpmdev-newspec project
project.spec created; type minimal, rpm version >= 4.11.

看一下project.spec的内容

Name:           project
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
SPEC指令含义
Namerpm安装包名称的项目名称,一般是rpmdev-newspec输入的项目名
Versionrpm安装包的大版本号
Releaserpm安装包的release小版本号
Summary关于安装包的描述
License开源软件包遵循的协议GPL/MIT/APACHE之类
BuildArch安装包的架构定义默认noarch
BuildRequires依赖的其他库名
Prefixrpm安装改安装根目录的参数如果没有则不能使用--prefix参数
%description软件安装包的详细描述
%prep软件构建前的准备动作
%build软件构建的编译步骤,如果是可执行文件这一步可不填
%install从~/rpmbuild/BUILD 拷贝至 ~/rpmbuild/BUILDROOT
%files安装包最终安装到目标系统的文件列表

rpm几个常用的命令

  • 带源码的rpm包制作 rpmbuild -bs ~/rpmbuild/SPECS/{项目的spec文件}

  • 二进制rpm包制作 rpmbuild -bb ~/rpmbuild/SPECS/{项目的spec文件}

  • 查询系统已安装软件 在一个新系统中,查询已安装的rpm软件包,可以使用如下命令行进行查询。 rpm -qa | grep {关键字}

  • 查询一个rpm安装包的信息 通过rpm命令可以获取到安装包包含的安装文件和默认的安装路径 rpm -qpl myproject-5.4.2-1.el7.noarch.rpm

制作示例

本章节通过一个SPEC例子,演示下rpm制作过程,查看myproject.spec

Name:           myproject
Version:        5.4.2
Release:        1%{?dist}
Summary:        myproject 5.4.2 build rpm

License:       GPL
URL:            https://www.example.com/%{name}
Source0:        https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz

Requires:      java, bash
BuildArch:     noarch
Prefix:        /usr

%description


%prep
%setup -q


%build


%install
mkdir -p %{buildroot}/%{_prefix}/%{name}-%{version}
cp -rf  %{_builddir}/%{name}-%{version}/* %{buildroot}/%{_prefix}/%{name}-%{version}

%clean
rm -rf %{buildroot}/%{_prefix}

%files
%{_prefix}/%{name}-%{version}




%changelog
* Wed Mar 22 2023 root

构建前准备(%prep)

先将要打包的二进制文件,先按照%{name}-%{version}的文件夹命名,并将二进制文件拷贝进该文件夹。然后将文件夹压缩用。如果没有按照这样文件层次,进行压缩包展开的时候会找不到文件夹。

[root@worker01 SOURCES]# tree -h
.

|-- [ 319]  myproject-5.4.2
|   |-- [136M]  log-distribute-5.4.2.release.jar
|   |-- [123M]  log-gateway-5.4.2.release.jar
|   |-- [174M]  log-in-es-5.4.2.release.jar
|   |-- [140M]  log-process-5.4.2.release.jar
|   |-- [231M]  log-report-5.4.2.release.jar
|   |-- [133M]  log-rule-5.4.2.release.jar
|   |-- [177M]  resources-admin-5.4.2.release.jar
|   |-- [5.7K]  spring-boot.sh
|   `-- [ 46M]  xxl-job-admin-2.1.2.jar
`-- [1.0G]  uam-5.4.2.tar.gz

构建过程(%build)

如果不是源码编译安装,这一步可以跳过。如果是源码编译整个过程可能会比较复杂,此处不做过多展开

打包准备(%install)

这一步是将BUILD目录下的项目编译文件或打包文件,拷贝至BUILDROOT目录的过程。如果这一步没有做,制作的rpm安装包就是一个空文件不包含任何二进制文件。

指定rpm中包含的文件列表(%files)

这个指令下面指的是最终要安装在目标系统的文件列表,默认从%{buildroot}目录下取寻找。