如何使用FPM轻松构建Linux软件包,用于多个平台
有许多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
同样,我们可以从目录构建任何包。