准备工作
为了更好的理解这个教程,请提前做好如下准备
- 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指令 | 含义 | |
|---|---|---|
| Name | rpm安装包名称的项目名称,一般是rpmdev-newspec输入的项目名 | |
| Version | rpm安装包的大版本号 | |
| Release | rpm安装包的release小版本号 | |
| Summary | 关于安装包的描述 | |
| License | 开源软件包遵循的协议GPL/MIT/APACHE之类 | |
| BuildArch | 安装包的架构定义默认noarch | |
| BuildRequires | 依赖的其他库名 | |
| Prefix | rpm安装改安装根目录的参数如果没有则不能使用--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}目录下取寻找。