Linux下开源打包工具fpm的安装与使用(超详细)

一、fpm概述

fpm是linux下的一款开源打包工具,可以用非常简单的方式,帮助你快速构建rpmdebsolaris等包,支持如下操作系统:

  • OSX/macOS
  • Red Hat systems (Fedora 22 or older, CentOS, etc)
  • Oracle Linux 7.x systems
  • Debian-derived systems (Debian, Ubuntu, etc)

github地址:https://github.com/jordansissel/fpm
fpm官网帮助:https://fpm.readthedocs.io/en/latest/

fpm采用ruby语言开发,所以使用前,需要在你的机器上安装ruby环境。

二、fpm的安装

以下以centos7.3为例,进行说明。在其他系统下的fpm安装,也可参考官网安装步骤:https://fpm.readthedocs.io/en/latest/installing.html#

1、安装ruby环境

安装ruby-devel、gcc、make、rpm-build、rubygems、ruby共6个包,安装过程遇到询问yes/no,自动选择yes。命令如下:

yum -y install ruby-devel gcc make rpm-build rubygems ruby

2、安装fpm

RubyGems是Ruby的一个包管理器,功能上类似于apt-get、yum等,所以我们需要通过RubyGems来安装fpm。

由于国外的源很慢,或者直接不能访问,需要将Ruby Gems源更换为国内的源。

添加阿里云的源:

gem sources --add http://mirrors.aliyun.com/rubygems/

删除官方的源:

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

查看当前源列表:

gem sources -l

在这里插入图片描述

安装1.4.0版fpm:

gem install fpm -v 1.4.0

如果安装过程出现错误,可参考第五章解决办法;没出现报错,请跳过第五章。

安装完毕,应该是如下这样:

在这里插入图片描述

查看fpm帮助:

fpm -help

在这里插入图片描述

说明,已经安装成功。

三、fpm的使用

fpm的使用也很简单,只要输入相应的参数值,就可以完成打包,并且支持rpm和deb,这样可以在不同的平台下使用相同的方式来打包,一劳永逸。

fpm打包是在终端中使用命令来完成的,支持很多的参数,使用形式,类似如下:

fpm -x yyy -z bbb -a jjjj

接下来,了解下fpm支持的命令参数。

1、fpm常用参数

FPM常用参数:

  • -s:指定源类型

  • -t:指定目标类型,即想要制作为什么包

  • -n:指定包的名字

  • -v:指定包的版本号

  • -C:指定打包的相对路径

  • -d:指定依赖于哪些包

  • -f:第二次包时目录下如果有同名安装包存在,则覆盖它;

  • -p:制作的rpm安装包存放路径,不想放在当前目录下就需要指定;

  • –post-install:软件包安装完成之后所要运行的脚本;同–offer-install

  • –pre-install:软件包安装完成之前所要运行的脚本;同–before-install

  • –post-uninstall:软件包卸载完成之后所要运行的脚本;同–offer-remove

  • –pre-uninstall:软件包卸载完成之前所要运行的脚本;同—before-remove

  • –prefix:制作好的rpm包默认安装路径;

支持的源类型包:

  • dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包
  • rpm: 对rpm进行转换
  • gem: 对rubygem包进行转换
  • python: 将Python模块打包成相应的类型

支持的目标类型包:

  • rpm: 转换为rpm包
  • deb: 转换为deb包
  • solaris: 转换为solaris包
  • puppet: 转换为puppet包

网上基本都能查到fpm相关资料,有些参数可能新版的fpm中,变成了不推荐使用。想要了解最新的参数,可以使用命令查看帮助。

fpm -help

下面,我们举个例子,来对fpm的使用加以说明。

2、举例要求

待打包的东西有2个:

  • 程序test,里面就是简单打印个hello world;
  • 测试文件1.txt。

我们想把它打成rpm包,并且安装到/opt/helloworldtest目录下,在安装完成后,自动将1.txt文件拷贝到根目录下;在卸载完成后,将根目录下的1.txt删除。

之所以在安装后,和卸载后,添加这个操作,是为了想在安装后添加桌面快捷方式,且在卸载后删除桌面快捷方式。为了简便,就直接用1.txt代替下吧,反正都是类似的,主要把fpm打的包,执行脚本原理解释清楚就行。

安装后的预期效果:

在这里插入图片描述

3、准备目录

首先我们需要建立3个目录,如下:

在这里插入图片描述

  • output,用于存放打好的包;
  • source,用于存放我们的可执行程序,这里是test程序和一个测试文件1.txt
  • sh,用于存放安装完成后执行的脚步install_after.sh,以及卸载完成后执行的脚本uninstall_after.sh

具体文件存放情况,如下:

在这里插入图片描述

使用fpm打包后,安装的原理,就是将source下的所有东西释放到安装目录下。

比如安装目录为/opt/helloworldtest,则其安装路径文件情况,如下:

在这里插入图片描述

4、编写脚本文件

install_after.sh内容如下:

#!/bin/sh
cp /opt/helloworldtest/1.txt /

uninstall_after.sh内容如下:

#!/bin/sh
rm /1.txt

把install_after.sh、uninstall_after.sh、test、1.txt这4个文件放到位后。就可以进行打包操作了。

5、打成rpm包

进入setupdir目录,即output、sh、source所在的目录:

在这里插入图片描述

输入如下命令,对source目录下进行打包rpm:

fpm -s dir -t rpm -n mytest -v 1.0.0 --iteration 1 -C source -f -p output --prefix /opt/helloworldtest --after-install sh/install_after.sh --after-remove sh/uninstall_after.sh

以上参数虽多,但是很简单,请看如下解释:

  • -s dir,将目录进行打包;
  • -t rpm,打成rpm包,也可以写deb,表示打成deb包;
  • -n mytest,包名为mytest,记住这个名字,卸载时,需要使用mytest名称;
  • -v 1.0.0,包的版本号为1.0.0;
  • –iteration 1,发布号为1,发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化;
  • -C source,打包的相对路径为source;
  • -f,多次打包时,输出目录下如果有同名安装包存在,则覆盖它;
  • -p output,输出的安装包的目录为output;
  • –prefix /opt/helloworldtest,指定包的安装路径为/opt/helloworldtest目录下;
  • –after-install sh/install_after.sh,软件包安装完成之后运行install_after.sh脚本;
  • –after-remove sh/uninstall_after.sh,软件包卸载完成之后运行uninstall_after.sh脚本。

最后,打包生成的rpm文件在output目录下。如下:

在这里插入图片描述

RPM包的组成格式:
mytest-1.0.0-1.x86_64.rpm
  |    |     |    |    |
软件名称|     |    |    |
     版本号   |    |  |
           发布号  |    |
               硬件平台 |
                      扩展名
例子备注:
    mytest :软件名称
    1.0.0  :软件版本号
    1      :发布号主要是对软件存在的bug或漏洞进行修补,在软件功能上并没有变化
    x86_64 :64位的PC架构,另外还有'i386' 'i686'32位的PC架构
    rpm    :扩展名

6、安装与卸载

测试,rpm安装:

rpm -i mytest-1.0.0-1.x86_64.rpm

测试,rpm卸载:

rpm -e mytest

此时使用的软件包名mytest,就是打包时,通过-n参数指定的名称。

经测试,安装、卸载均达到预期效果。

为了照顾不了解的小伙伴,所以尽可能的写的详细,似乎让人感觉反而复杂了。不过fpm的使用本来就很简单,其实就是一条命令的事儿。跟着做一遍,基本就很清楚了。

四、下载一键打包例子

为了最大简化操作,特意将打包命令写成脚本文件,实现一键打包(./make_rpm.sh)。

文章中打包的例子,提供压缩包下载:

链接: https://pan.baidu.com/s/1VPI5vBtPsjI6GsGC6cRdyg

提取码: tr8t

在这里插入图片描述

五、报错解决

错误描述

使用“gem install fpm -v 1.4.0”安装fpm时,报错“childprocess requires Ruby version >= 2.4.0”,如下:

在这里插入图片描述

原因

安装childprocess-4.0.0.gem包时,要求ruby版本必须>=2.4.0。我们使用命令“ruby -v”查看ruby版本,如下:

在这里插入图片描述

解决办法

升级ruby版本。详细步骤如下:

(1)离线安装rvm

rvm是用来管理ruby的,而ruby的其中一个“程序”叫rubygems,也就是我们用它装fpm的,手工装各种库用gem。

所以,我们首先安装rvm,这个在线速度很慢,我这里使用离线安装。

下载rvm包,大概一会,就可以下载完毕:

curl -sSL https://github.com/rvm/rvm/tarball/stable -o rvm-stable.tar.gz

解压rvm包:

tar -xzvf rvm-stable.tar.gz

进入解压目录:

cd rvm-rvm-cc69ed9

安装rvm:

./install --auto-dotfiles

加载rvm:

source /usr/local/rvm/scripts/rvm

(2)升级2.6.3版ruby

查看rvm可安装版本:

rvm list known

安装ruby 2.6.3:

rvm install 2.6.3

下载中,可能下载比较久,下载完毕,自动开始安装,如下:

在这里插入图片描述

设置默认使用ruby版本:

rvm use 2.6.3 --default

在这里插入图片描述

可以看到ruby已升级至2.6.3。

再次执行gem install fpm -v 1.4.0,就不会再报这个错误了,一会就安装完成了。

参考链接:

《用fpm来做rpm打包》

《fpm安装和使用fpm打包rpm》



若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值