如何使用FPM轻松构建Linux软件包,用于多个平台

时间:2020-03-21 11:42:45  来源:igfitidea点击:

有许多Linux发行版,不同Linux发行版的包装应用是相当耗时和困难的任务。
包装应用不是每个人的一块蛋糕。
幸运的是,还有一种构建包的替代和最简单的方法。
符合FPM(效果包管理),一个命令行程序,有助于轻松构建Linux包。
我们还可以将包转换为不同的格式,以便可以在不同类型的Linux操作系统上安装软件包。
是的,Ubuntu的捕捉和FlatPaks正在快速增长,并且可以安装在大多数Linux发行版上。
但是,如果我们想要打包尚未提供的应用程序,则为分发,FPM是这样做的一种方法。
而且,比传统包装方法更容易。
FPM是完全免费的,使用Ruby编程语言编写的开源工具。

在本教程中,我们将讨论如何在Linux中使用FPM构建包。

安装FPM.

由于FPM使用Ruby编写,因此必须先安装Ruby。
Ruby预装了一些操作系统。
如果未安装它,则根据我们使用的分发运行以下命令。

关于Arch Linux及其变体:

$sudo pacman -S ruby

在Red Hat Systems(Fedora 22或者更老,CentOS等):

$sudo yum install ruby-devel gcc make rpm-build

在Fedora 23或者Newer:

$sudo dnf install ruby-devel gcc make rpm-build

在Debian派生系统(Debian,Ubuntu等)上:

$sudo apt-get install ruby ruby-dev rubygems gcc make rpm

我们还可以使用LinuxBrew Package Manager安装Ruby。

安装LinuxBrew后,运行此命令以安装Ruby。

$brew install ruby

安装了Ruby后,运行以下命令以安装FPM:

$sudo gem install --no-ri --no-rdoc fpm

我们将看到下面的输出。

Fetching: cabin-0.9.0.gem (100%)
 Successfully installed cabin-0.9.0
 Fetching: backports-3.6.8.gem (100%)
 Successfully installed backports-3.6.8
 Fetching: arr-pm-0.0.10.gem (100%)
 Successfully installed arr-pm-0.0.10
 Fetching: clamp-1.0.1.gem (100%)
 Successfully installed clamp-1.0.1
 Fetching: ffi-1.9.17.gem (100%)
 Building native extensions. This could take a while...
 Successfully installed ffi-1.9.17
 Fetching: childprocess-0.6.1.gem (100%)
 Successfully installed childprocess-0.6.1
 Fetching: archive-tar-minitar-0.5.2.gem (100%)
 Successfully installed archive-tar-minitar-0.5.2
 Fetching: io-like-0.3.0.gem (100%)
 Successfully installed io-like-0.3.0
 Fetching: ruby-xz-0.2.3.gem (100%)
 Successfully installed ruby-xz-0.2.3
 Fetching: stud-0.0.22.gem (100%)
 Successfully installed stud-0.0.22
 Fetching: mustache-0.99.8.gem (100%)
 Successfully installed mustache-0.99.8
 Fetching: insist-1.0.0.gem (100%)
 Successfully installed insist-1.0.0
 Fetching: dotenv-2.2.0.gem (100%)
 Successfully installed dotenv-2.2.0
 Fetching: pleaserun-0.0.28.gem (100%)
 Successfully installed pleaserun-0.0.28
 Fetching: fpm-1.8.1.gem (100%)
 Successfully installed fpm-1.8.1
 15 gems installed

要确保是否正确安装FPM,请运行以下命令。

$fpm --version

或者,

$fpm --v

示例输出将是:

1.8.1

如果我们看到如上所述的输出,恭喜! FPM已准备好使用。

使用FPM轻松构建Linux软件包,用于多个平台

使用FPM来构建包的典型命令如下:

$fpm -s <source type> -t <target type> [list of sources]...

其中

  • -s <source类型> - 源包的类型。它将是一个目录(dir),rubygem(gem),rpm(rpm),python封装(python),php梨模块(梨)等。
  • -t <target_type> - 输出包的类型,如.rpm,.deb等。

以下是源和目标文件类型的完整列表。

来源:

  • gem
  • python modules
  • pear
  • directories
  • tar(.gz) archives
  • rpm
  • deb
  • node packages (npm)
  • pacman (ArchLinux) packages

目标:

  • deb
  • rpm
  • solaris
  • freebsd
  • tar
  • 目录
  • Mac OS x .pkg文件
  • Pacman(Archlinux)包

我们还可以通过键入终端的以下命令随时键入帮助部分。

$fpm --help

构建RPM包

将介绍一些更好的例子。
以下命令将下载最新的JSON GEM并将其转换为.rpm包:

$fpm -s gem -t rpm json

示例输出:

Created package {:path=>"rubygem-json-2.0.3-1.x86_64.rpm"}

上面的命令将从rubygems.org下载最新的"json"rubygem并将其转换为.rpm。
在上面的输出中看到,此命令已创建一个名为"rubygem-json-version_arch.deb"的包,具有适当的版本/拱门。
很容易,不是吗?
当然是的!

它刚刚花了一分钟来构建这个.rpm包。
包将存储在当前工作目录中。
现在,我们可以在RHEL,CentOS,Fedora等任何基于RPM的分布上安装此RPM包,如下所示。

$sudo rpm -ivh rubygem-json-2.0.3-1.x86_64.rpm

我们可以查看以下新创建的.rpm包的详细信息如下。

$sudo rpm -qip rubygem-json-2.0.3-1.x86_64.rpm

示例输出:

Name : rubygem-json
Version : 2.0.3
Release : 1
Architecture: x86_64
Install Date: (not installed)
Group : Languages/Development/Ruby
Size : 1487109
License : Ruby
Signature : (none)
Source RPM : rubygem-json-2.0.3-1.src.rpm
Build Date : Tue 21 Nov 2016 03:45:50 PM IST
Build Host : server1.theitroad.local
Relocations :/
Packager : <Hyman@theitroad>
Vendor : Florian Frank
URL : http://flori.github.com/json
Summary : This is a JSON implementation as a Ruby extension in C.
Description :
This is a JSON implementation as a Ruby extension in C.

正如我们在上面的输出中看到的,FPM自动挑选包名,版本,架构,安装日期,维护者,主页,以及所有来自Ruby包本身的描述。
多么酷啊?
我们无需手动添加任何内容。
FPM将照顾一切。

要查看依赖项,请运行:

$rpm -qRp rubygem-json-2.0.3-1.x86_64.rpm

示例输出

rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1

让我们看到另一个例子。

建立DEB包

要制作DEB包,只需用'.deb'替换".rpm"这个词。
在上面的示例中,我们使用的是构建JSON GEM并将其转换为.rpm包使用:

$fpm -s gem -t rpm json

同样,要使Deb包,运行:

$fpm -s gem -t deb json

示例输出:

Debian packaging tools generally labels all files in /etc as config files, as mandated by policy, so fpm defaults to this behavior for deb packages. You can disable this default behavior with --deb-no-default-config-files flag {:level=>:warn}
Debian packaging tools generally labels all files in /etc as config files, as mandated by policy, so fpm defaults to this behavior for deb packages. You can disable this default behavior with --deb-no-default-config-files flag {:level=>:warn}
Created package {:path=>"rubygem-json_2.0.3_amd64.deb"}

要检查新创建的包的详细信息,请运行:

$dpkg --info rubygem-json_2.0.3_amd64.deb

示例输出:

new debian package, version 2.0.
 size 581592 bytes: control archive=4018 bytes.
 327 bytes, 12 lines control 
 11986 bytes, 126 lines md5sums 
 Package: rubygem-json
 Version: 2.0.3
 License: Ruby
 Vendor: Florian Frank
 Architecture: amd64
 Maintainer: <Hyman@theitroad>
 Installed-Size: 1640
 Provides: rubygem-json
 Section: Languages/Development/Ruby
 Priority: extra
 Homepage: http://flori.github.com/json
 Description: This is a JSON implementation as a Ruby extension in C

要查看上述包的依赖项,请运行:

$dpkg -c ./rubygem-json_2.0.3_amd64.deb

构建特定的版本包

到目前为止我们看到的命令创造了最新的稳定版本。
如果我们需要构建特定版本包,则可以使用命令执行此操作:

$fpm -s gem -t deb -v 2.0.0 json

上面的命令将下载rubyjson verion 2.0.0并将其转换为.deb包。

示例输出:

[...]
Created package {:path=>"rubygem-json_2.0.0_amd64.deb"}

同样,我们可以将特定名称分配给如下面的包。

$fpm -s gem -t deb -n my_json -v 2.0.0 json

示例输出:

[...]
Created package {:path=>"my-json_2.0.0_amd64.deb"}

如上所述,我已为包分配了自定义名称:my-json_2.0.0_amd64.deb。

将rpm转换为deb软件包,反之亦然

我们不必为不同的平台创建软件包。
只需将它们从一种格式转换为另一个格式。
以下命令将RPM包转换为DEB包。

$fpm -t deb -s rpm rubygem-json-2.0.3-1.x86_64.rpm

请注意,我已经改变了一点语法。
目标类型(-t)首先是下一个,源类型。

示例输出:

[..]
Created package {:path=>"rubygem-json_2.0.3-1_amd64.deb"}

从源目录构建包

以下是创建"Hello"程序的RPM的简单步骤。

$wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
$tar -zxvf hello-2.10.tar.gz
$cd hello-2.10/
$./configure --prefix=/usr
$make

接下来,将其安装到临时目录,如下所示:

$mkdir /tmp/installdir
$make install DESTDIR=/tmp/installdir/

现在,使用以下FPM制作RPM包。

$fpm -s dir -t rpm -n hello -v 2.10 -C /tmp/installdir

其中-s表示源文件类型(目录),-t是包的类型(rpm),-n是荷兰的包和-v的名称是版本; -c是目录(例如,e.g/tmp/installdir),其中fpm将查找文件。

示例输出:

Created package {:path=>"hello-2.10-1.x86_64.rpm"}

要创建DEB包,请运行以下命令:

$fpm -s dir -t deb -n hello -v 2.10 -C /tmp/installdir

同样,我们可以从目录构建任何包。