app开发定制公司定制RPM包(FPM和原生rpmbuild)

例子:



一、FPMapp开发定制公司工具进行打包

1. app开发定制公司更新软件源

yum update
  • 1

2. 安装fpm模块依赖

yum -y install ruby rubygems ruby-devel
  • 1

3. 更换rubygems仓库

  1. app开发定制公司查看当前源
gem source list
  • 1


2. app开发定制公司更换阿里源

gem sources -a  http://mirrors.aliyun.com/rubygems/
  • 1


3. app开发定制公司移除原生源

gem sources --remove https://rubygems.org/
  • 1

4. 安装fpm工具

gem install fpm
  • 1

app开发定制公司可能会出现的问题:


原因:在centos7中yumapp开发定制公司最高支持到2.0.0,而fpm安装需要ruby支持到2.3.0
解决办法:

  1. 安装RAM密钥(二选一,app开发定制公司失败重复尝试)

命令一:

gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
  • 1

命令二:

command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
  • 1

command curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -
  • 1

  1. 安装RAM(app开发定制公司经常会失败,app开发定制公司重复尝试直到成功)
curl -L get.rvm.io | bash -s stable
  • 1

  1. 更新配置文件
source /etc/profile.d/rvm.sh
  • 1
  1. 查看可安装脚本
rvm list known | grep ruby
  • 1

  1. 安装ruby 2.6
rvm install 2.6
  • 1

  1. 查看当前ruby版本
ruby -v
  • 1

5. 检查是否正确安装

fpm --help
  • 1

6. fpm参数

常用参数

1.-s 指定源类型
2.-t 指定目标类型,即想要制作为什么包
3.-n 指定包的名字
4.-v 指定包的版本号
5.-C 指定打包的相对路径 Change directory to here before searchingforfiles
6.-d 指定依赖于哪些包
7.-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
8.-p 输出的安装包的目录,不想放在当前目录下就需要指定
9.–post-install 软件包安装完成之后所要运行的脚本;同–after-install
10.–pre-install 软件包安装完成之前所要运行的脚本;同–before-install
11.–post-uninstall 软件包卸载完成之后所要运行的脚本;同–after-remove
12.–pre-uninstall 软件包卸载完成之前所要运行的脚本;同–before-remove

7. 安装软件

将源代码软件进行编译安装。具体看软件。建议将一个编译后的软件存放到指定地方。

8. 编写shell脚本

以Nginx为例子:

#!/bin/bash# 源码编译一般都要添加执行用户useradd nginx -M -s /sbin/nologin
  • 1
  • 2
  • 3
  • 4
  • 5

9.打包

打包格式:
fpm -s 源文件类型 -t 目标文件类型 -n 打包后名称 -v 打包后版本号 -d 所需要依赖 --post-install 安装完后执行的脚本 -f 源文件地址
以Nginx为例子:

fpm -s dir -t rpm -n nginx -v 1.20.1 -d 'pcre-devel,openssl-devel' --post-install /root/rpm_building/ngnix_rpm.sh -f /opt/nginx/
  • 1

参数说明:

1.-s 指定源类型
2.-t 指定目标类型,即想要制作为什么包
3.-n 指定包的名字
4.-v 指定包的版本号
5.-d 指定依赖于哪些包
6.-f 第二次打包时目录下如果有同名安装包存在,则覆盖它
7.–post-install 软件包安装完成之后所要运行的脚本;同–after-install

可能会出现的错误:

  • Need executable ‘rpmbuild’ to convert dir to rpm {:level=>:error}

解决办法:安装rpm-build

yum install rpm-build -y
  • 1

10.安装rpm包

方法一:rpm命令安装(离线麻烦)

使用rpm命令安装

rpm -ivh nginx-1.20.1-1.x86_64.rpm
  • 1

这种方法直接安装会出现依赖错误,需要先 yum 或手动安装依赖才能安装 rpm 包。

方法二:yum命令安装(在线简单)

yum -y localinstall nginx-1.20.1-1.x86_64.rpm
  • 1

这种方法会先安装依赖,再安装rpm包

11.注意点

  1. 测试centos7环境下编译的软件,在centos8下能运行;centos8下编译软件无法在centos7上运行。

二、原生rpmbuild打包rpm包

1.打包流程

  1. 源代码放到%_sourcedir中
  2. 源代码解压到%_builddir中,并进行编译
  3. 将编译好的软件安装到%_buildrootdir中
  4. 编写SPEC文件,并存放到其他目录
  5. 执行打包程序,将打包好的二进制rpm包存放在%_rpmdir中,源码rpm包文件存放在%_srcrpmdir中。
默认位置宏代码名称用途
~/rpmbuild%_topdir工作空间目录保存rpmbuild时的相关文件
~/rpmbuild/SPECS%_specdirSpec 文件目录保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES%_sourcedir源代码目录保存源码包(如 .tar 包)和所有 patch 补丁
~/rpmbuild/BUILD%_builddir构建目录源码包被解压至此,并在该目录的子目录完成编译
~/rpmbuild/BUILDROOT%_buildrootdir最终安装目录保存 %install 阶段安装的文件
~/rpmbuild/RPMS%_rpmdir标准 RPM 包目录生成/保存二进制 RPM 包
~/rpmbuild/SRPMS%_srcrpmdir源代码 RPM 包目录生成/保存源码 RPM 包(SRPM)

源码rpm包和二进制rpm包区别:

  • 源码rpm包运行后是出现源码文件,要运行程序还要进行make进行编译。打包原理:压缩源码文件目录,跟压缩包一样。
  • 二进制rpm包解压后直接就可以运行文件。打包原理:先进行源码包的编译和安装,然后将安装好的文件进行打包。

2.SPEC文件

SPEC文件说明:

阶段读取的目录写入的目录具体动作
%prep%_sourcedir%_builddir读取位于%_sourcedir目录的源代码和 patch。之后,解压源代码至%_builddir的子目录并应用所有 patch。
%build%_builddir%_builddir编译位于%_builddir构建目录下的文件。通过执行类似./configure && make的命令实现。
%install%_builddir%_buildrootdir读取位于%_builddir构建目录下的文件并将其安装至%_buildrootdir目录。这些文件就是用户安装 RPM 后,最终得到的文件。注意一个奇怪的地方: 最终安装目录 不是 构建目录。通过执行类似make install的命令实现。
%check%_builddir%_builddir检查软件是否正常运行。通过执行类似make test的命令实现。很多软件包都不需要此步。
bin%_buildrootdir%_rpmdir读取位于%_buildrootdir最终安装目录下的文件,以便最终在%_rpmdir目录下创建 RPM 包。在该目录下,不同架构的 RPM 包会分别保存至不同子目录,noarch目录保存适用于所有架构的 RPM 包。这些 RPM 文件就是用户最终安装的 RPM 包。
src%_sourcedir%_srcrpmdirb创建源码 RPM 包(简称 SRPM,以.src.rpm作为后缀名),并保存至%_srcrpmdir目录。SRPM 包通常用于审核和升级软件包。

3.宏定义文件

宏定义:
宏的格式–> %_topdir
宏表示一个变量,如环境变量。这个变量指向一个路径或者其他含义。

查找rpmbuild定义文件

rpmbuild --showrc | grep Macro
  • 1


从这张图中看出很多地方都可以定义宏。

查询宏命令路径

rpmbuild --showrc | grep _mandir
  • 1

常用宏文件的定义

%{_sysconfdir} /etc
%{_prefix} /usr
%{_exec_prefix} %{_prefix}
%{_bindir} %{_exec_prefix}/bin
%{_libdir} %{_exec_prefix}/%{_lib}
%{_libexecdir} %{_exec_prefix}/libexec
%{_sbindir} %{_exec_prefix}/sbin
%{_sharedstatedir} /var/lib
%{_datarootdir} %{_prefix}/share
%{_datadir} %{_datarootdir}
%{_includedir} %{_prefix}/include
%{_infodir} /usr/share/info
%{_mandir} /usr/share/man
%{_localstatedir} /var
%{_initddir} %{_sysconfdir}/rc.d/init.d
%{_var} /var
%{_tmppath} %{_var}/tmp
%{_usr} /usr
%{_usrsrc} %{_usr}/src
%{_lib} lib (lib64 on 64bit multilib systems)
%{_docdir} %{_datadir}/doc
%{buildroot} %{_buildrootdir}/%{name}-%{version}-%{release}.%{_arch}
$RPM_BUILD_ROOT %{buildroot}

4.安装rpmbuild工具

yum install rpm-build -y
  • 1

5.建立工作路径

在家目录下分别创建rpmbuild/BUILD、rpmbuild/RPMS、rpmbuild/SOURCES、rpmbuild/SPECS、rpmbuild/SRPMS目录。

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
  • 1


文件夹含义:

默认位置宏代码名称用途
~/rpmbuild%_topdir工作空间目录保存rpmbuild时的相关文件
~/rpmbuild/SPECS%_specdirSpec 文件目录保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES%_sourcedir源代码目录保存源码包(如 .tar 包)和所有 patch 补丁
~/rpmbuild/BUILD%_builddir构建目录源码包被解压至此,并在该目录的子目录完成编译
~/rpmbuild/BUILDROOT%_buildrootdir最终安装目录保存 %install 阶段安装的文件
~/rpmbuild/RPMS%_rpmdir标准 RPM 包目录生成/保存二进制 RPM 包
~/rpmbuild/SRPMS%_srcrpmdir源代码 RPM 包目录生成/保存源码 RPM 包(SRPM)

6.下载源码

cd ~/rpmbuild/SOURCESwget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
  • 1
  • 2

7.编写SPEC文件

cd ~/rpmbuild/SPECSvim hello.spec
  • 1
  • 2

spec文件进去后会自动加载模板,模板初始样子如下:

编写好的文件如下:

# 软件名Name:           hello# 版本号Version:        2.10# 发布编号Release:        1%{?dist}# 软件说明Summary:        The "Hello World" program from GNUSummary(zh_CN): GUN "Hello Word" 程序# 包所属类别,但目前基本已经被弃用,直接删除即可Group:          Applications/Productivity# 软件包的版权协议License:        GPLv3+URL:            http://ftp.gnu.org/gnu/helloSource0:        http://ftp.gnu.org/gnu/hello/%{name}-%{version}.tar.gz# 编译需要的依赖BuildRequires: gettext# 本软件需要的依赖#Requires:      # 安装后的依赖Requires(post): info# 卸载前的依赖Requires(preun): info# 描述%descriptionThe "Hello World" program, done with all bells and whistles of a proper FOSSproject, including configuration, build, internationalization, help files, etc.%description -l zh_CN"Hello World" 程序, 包含 FOSS 项目所需的所有部分, 包括配置, 构建, 国际化, 帮助文件等.%prep%setup -q# 编译阶段执行的命令%build%configuremake %{?_smp_mflags}# 安装阶段执行的命令%installmake install DESTDIR=%{buildroot}# 查找 install 中的语言文件%find_lang %{name}rm -f %{buildroot}/%{_infodir}/dir# 安装后执行的命令%post/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir || :# 卸载前执行的命令%preunif [ $1 = 0 ] ; then/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir || :fi# 将所需要打包的文件都存放到这边中;-f %{name}.lang 加上后的意思为声明找到的文件%files -f %{name}.lang# doc添加的是说明文档%doc AUTHORS ChangeLog NEWS README THANKS TODO%license COPYING%{_mandir}/man1/hello.1.*%{_infodir}/hello.info.*%{_bindir}/hello# 软件更新说明%changelog* Sun Dec 4 2016 Your Name <youremail@xxx.xxx> - 2.10-1- Update to 2.10* Sat Dec 3 2016 Your Name <youremail@xxx.xxx> - 2.9-1- Update to 2.9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

8.检查SPEC文件正确性

rpmlint hello.spec
  • 1

9.构建rpm包

cd ~/rpmbuild/SPECSrpmbuild -ba hello.spec
  • 1
  • 2


查看下输出的内容:

tree ~/rpmbuild/*RPMS
  • 1

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发