介绍
Linux的不同发行版使用的打包格式对于希望以易于消费的方式发布其项目的软件开发人员来说是一个痛点。 Debian和Ubuntu依靠.deb
软件包,而Fedora和RedHat都使用.rpm
式包装系统。 这些是不兼容的,创建它们所需的工具对于不熟悉每个人的偏心的人来说可能是相当困难的。
虽然分发包的软件包维护者对官方软件包中包含的软件包做了大量的工作,但如果您计划在自己的网站上发布这些软件包,或者需要为您的组织创建软件包,则通常需要自己提供软件包。 这传统上涉及学习每个包装系列的至少几个工具的工作。
为了尽量减少这一过程的并发症,一个工具,称为fpm
已创建。 使用fpm
,您可以轻松地同时创建.deb
和.rpm
,而无需了解任何的,它充分利用了包装工具的命令文件。 在本指南中,我们将讨论如何使用fpm
创建使用一个Ubuntu 14.04服务器不同格式的软件包。
安装FPM
分布的主要方法fpm
工具本身是作为RubyGem。 我们可以得到我们准备安装系统fpm
通过安装两个Ruby开发包和编译其他软件所需要的软件建设工具。
首先,更新本地包缓存,然后继续进行必备的安装:
sudo apt-get update
sudo apt-get install ruby-dev build-essential
一旦上述软件包安装,您可以获取fpm
包本身通过键入:
sudo gem install fpm
这将安装fpm
在系统级,并将其提供给系统上的任何用户。 常规封装智慧建议您创建包作为正常的非root用户。 这在包装错误可能会影响您的系统的情况下更安全。
您现在应该有fpm
系统上可用的可执行文件。 您可以通过查看工具丰富的帮助信息来验证此信息:
fpm --help
Intro:
This is fpm version 1.2.0
If you think something is wrong, it's probably a bug! :)
Please file these here: https://github.com/jordansissel/fpm/issues
You can find support on irc (#fpm on freenode irc) or via email with
fpm-users@googlegroups.com
Usage:
fpm [OPTIONS] [ARGS] ...
. . .
您现在可以开始构建软件包。
熟悉基本FPM功能
该fpm
工具是在告诉你它需要完成一个包构建还算不错。 要了解最基本的要求,可以调用不带参数的命令:
fpm
Missing required -s flag. What package source did you want? {:level=>:warn}
Missing required -t flag. What package output did you want? {:level=>:warn}
No parameters given. You need to pass additional command arguments so that I know what you want to build packages from. For example, for '-s dir' you would pass a list of files and directories. For '-s gem' you would pass a one or more gems to package from. As a full example, this will make an rpm of the 'json' rubygem: `fpm -s gem -t rpm json` {:level=>:warn}
Fix the above problems, and you'll be rolling packages in no time! {:level=>:fatal}
这个输出告诉我们我们需要提供什么来创建一个包的基础。 典型的调用在其基本形式如下:
fpm -s source_type -t target_type source_name_or_location
源可以是多种类型中的任何一种。 源类型还将指示将源名称或位置传递给命令的方式。 我们将在下一节讨论可能的输入和输出格式。
某些格式将需要与要安装的单个软件包类型相关联的附加帮助程序实用程序才能进行转换。 既然我们已经为了得到已经安装了Ruby要领fpm
的工作,因为我们使用的是Ubuntu系统,一个RubyGem文件转换为.deb
包应该是可能的。
让我们选择一个常用的Gem,如bundler
。 我们可以创建一个.deb
从包装bundler
通过打字位于rubygems.org包:
fpm -s gem -t deb bundler
Created package {:path=>"rubygem-bundler_1.6.5_all.deb"}
一个名为rubygem-bundler_1.6.5_all.deb
在本地目录(版本号可能会有所不同)创建的。 现在,我们可以像我们其他任何安装这个.deb
包:
sudo dpkg -i rubygem-bundler_1.6.5_all.deb
当你检查安装的gems列表,你会看到我们现在有bundler可用:
gem list
*** LOCAL GEMS ***
arr-pm (0.0.9)
backports (3.6.0)
bundler (1.6.5)
cabin (0.6.1)
childprocess (0.5.3)
clamp (0.6.3)
ffi (1.9.3)
fpm (1.2.0)
json (1.8.1)
我们可以很容易地使用不同的源或输出格式,但这些需要我们的系统上的一些额外的工具来转换格式。 我们稍后将讨论这个问题。
源和目标格式
该fpm
工具可以用很多不同的源和目标格式。 这些都有自己的要求和功能。
在有一个格式的相对标准封装指数在线(如rubygems.org为RubyGem文件)的情况下, fpm
能够自动搜索索引和下载所需的文件。 它将首先搜索当前目录中的匹配,然后在索引中查找未找到本地匹配。
目前支持以下源类型:
源类型 | 源描述 | 如何传递源名称或位置 | 需要其他软件包 |
---|---|---|---|
dir | 目录或文件 | 在本地文件系统上传递项目文件的绝对路径或相对路径。 | (没有) |
柏油 | 一个tarball源码包 | 将路径传递到本地文件系统上的压缩包(压缩或未压缩)的位置。 | (没有) |
Gem | 一个RubyGem | 通过一个Ruby的Gem,可以上找到的名称www.rubygems.org 。 它将自动下载以创建包。 | ruby , rubygems-integration |
python | 一个Python包 | 通过Python包的名字,你会通过它easy_install 。 在Python包索引中搜索名称并自动下载以创建包。 |
python-setuptools |
梨 | PHP扩展 | 传递在pear.php.net上找到的PHP扩展名或应用程序的名称。 创建包时,将自动下载相应的文件。 | php-pear |
cpan | 一个Perl模块 | 传递在cpan.org找到的Perl模块的名称。 这些文件将自动下载并用于构建软件包。 | cpanminus |
压缩 | 压缩的目录结构 | 传递包含软件包的zip文件在本地文件系统上的位置。 | zip |
npm | Node.js模块 | 传递在npmjs.org上指定的Node模块的名称。 软件包将自动下载并用于生成输出包。 | npm |
osxpkg | 一个OS X包 | 传位置上的OS X包的本地文件系统(这只是将OS X系统的工作pkgbuild 在他们的道路)。 |
pkgbuild (仅适用于OS X系统) |
空 | (无源) | 用于创建没有任何实际包的包。 这是最常用的只包含依赖关系的元包。 | (没有) |
辩论 | 一个.deb 包 |
传递的位置.deb 在本地文件系统的文件。 |
(没有在基于Debian的系统上) |
rpm | 一个.rpm 包 |
传递一个位置.rpm 本地文件系统上的文件。 |
rpm |
对于您要创建的目标包装格式,还有很多选项。 下表描述了一些不同的选项:
输出类型 | 输出说明 | 需要其他软件包 |
---|---|---|
辩论 | Debian风格的软件包,可以安装在Debian或Ubuntu系统上。 | (没有在基于Debian的系统上) |
rpm | 一个RedHat样式的包,可以安装在CentOS,Fedora或RedHat系统上。 | rpm |
压缩 | 包含输入包的目录和文件结构的zip文件。 | zip |
柏油 | 输入包的目录结构的压缩包(压缩或未压缩)。 | (没有) |
dir | 其中提取输入的包的目录。 | (没有) |
嘘 | 自解压.sh 文件。 这是一个带有bzipped tar文件的shell脚本,将在运行时解压缩。 |
(没有) |
osxpkg | 为OS X程序包文件时,必须在OS X安装与合作pkgbuild 安装到创建这些包。 |
pkgbuild (仅适用于OS X系统) |
solaris | 适用于在Solaris系统上安装的软件包。 您必须pkgproto 和pkgmk 安装,这是仅适用于Solaris机器。 |
pkgproto , pkgmk (仅适用于Solaris系统) |
pkgin | 适合在BSD系统上安装的软件包。 您必须具有pkg_create 安装包,这是只有在BSD系统上可用。 |
pkg_create (仅适用于BSD系统) |
Puppet | 可用于在各种系统上安装的Puppet模块。 ( 注:此格式不与FPM当前版本的正常工作 )。 | (不能在非工作状态下测试) |
如您所见,源和目标规范的一些格式要求您在特定操作系统上。 由于我们是在Ubuntu 14.04中,展示了这一工具osxpkg
源格式,以及osxpkg
, solaris
和pkgin
输出格式将不可用。
使用选项更改FPM行为
使用来自上述部分表中的信息,你应该能够创建一个使用一些基本的包fpm
默认设置。 但是,大多数时候,您将需要提供一些额外的信息,以形成最终的软件包。
应在指定原始包的位置或名称的源参数之前指定选项。
有可用于许多不同的选择fpm
。 我们将只介绍下面几个更常见的。 有关完整列表,请查阅fpm --help
命令。
您可能希望使用的一些常见选项是:
- -C:指定目录中寻找文件之前改变。
- --prefix:指定在哪里产生的包中的文件将被安装到一个目录路径。
- -p:包名称和路径为你的包。 这可以覆盖生成的包文件的文件名。
- -n:您希望使用程序包的名称。 这是在您的平台的包装工具中显示的名称。
- -v:你想使用你的包的版本号。
- --iteration:软件包的版本信息。 此数字的分发名称不同,但通常是跟踪包版本的方式,而不是应用程序的版本。
- --license:发牌名包。 这将包括软件包的元数据中的许可证类型,但不会在软件包本身中包括关联的许可证文件。
- --category:这个包所属的类别。 这可以用于在软件包内组织软件包。
- -d:这可以多次使用,以指定包的依赖关系。
- --provides:这可以用于指定系统的功能,这包提供。 这通常在有多个选择来满足要求时使用。
- --conflicts:用于指定不能安装该包。
- --replaces:用于指定安装这个包时,应删除的包。
- --config-文件 :用来标记包作为配置文件中的文件。 通常,当包被移除时,包管理器将保持这些完整。
- --directories:标记目录由包所拥有。
- -a:指定包的体系结构。
- -m:覆盖包维护者领域。 默认情况下,这将使用
username@host
此字段。 - -e:手动审查和编辑之前建立包规范文件。 这可以用来调整已经用于软件包规格的任何默认值。
- --description:设置程序包的描述。
- --AFTER安装 ,--before安装 ,--AFTER -删除 ,--before -删除 :应该在适当的时候运行脚本文件。
还有很多特定于您选择的包装格式的选项。 有关完整列表,请查看帮助。
自定义包
如果要自定义更多详细信息,并且不希望将一种格式直接转换为输出格式,则可能需要采用不同的工作流程。
这个过程将更加密切地反映传统的包装,但也将提供能够快速生产多种输出格式的好处。 我们可以证明下面的一般工作流程,假设有问题的应用程序使用标准./configure
, make
, make install
编译和安装过程。
首先,安装包所需的所有依赖项。 然后,从其网站获取项目的源包,并将其放在工作目录中:
mkdir ~/build
cd ~/build
wget http://example.com/project.tar.gz
现在,您可以提取文件并更改为生成的目录:
tar xzvf project.tar.gz
cd project
在此目录中,您将具有要打包的应用程序的源文件。 您现在有机会对文件进行一些调整并配置一些选项。
指定在构建过程中选择了正常的方法是使用附带./configure
脚本。 查看项目的文档以了解哪些编译选项可用。 您可以通过调用指定它们configure
与您选择的脚本:
./configure --compilation_option=value --another_option=value --optional_flag ...
这将创建或修改被读取文件make
命令正在建设的包时。 我们现在可以通过键入以下内容创建实际的安装文件:
make
而不是安装我们在系统上配置的这些文件,我们将它们安装到一个空的虚拟目录,我们可以构建一个真正的包。 创建要安装软件包的目录:
mkdir -p /tmp/project
我们可以通过传递标签这个新的目录作为根安装位置DESTDIR
选项,以make install
:
make DESTDIR=/tmp/project install
我们的包现在已经干净地安装到一个空骨骼目录。 它已经创建了所有必需的目录结构,但没有与该目录中的包无关的。
这是您第二次定制设置的机会。 如果希望在安装的层次结构中包括其他文件,则可以将它们添加到此结构中的相应位置。
当你准备好了,你可以用fpm
创建适当的包文件。 例如,我们可以在一些版本信息和包装内我们描述过fpm
命令。 我们还可以列出依赖项信息或提供影响打包元文件创建的其他详细信息。
我们可以使用目录结构来构建多种打包格式。 例如,我们可以再创建一个.deb
通过键入包:
fpm -s dir -t deb -C /tmp/project --name project_name --version 1.0.0 --iteration 1 --depends debian_dependency1 --description "A sample package" .
这将创建一个包叫做project-name_1.0.0-1_amd64.deb
在当前目录。
然后,您可以修改几个选项来创建一个.rpm
包(假设你安装rpm
从仓库包):
fpm -s dir -t rpm -C /tmp/project --name project_name --version 1.0.0 --iteration 1 --depends redhat_dependency1 --description "A sample package" .
这将创建一个包叫做project_name-1.0.0-1.x86_64.rpm
在当前目录。
正如你所看到的,它是相当容易与创建定制的包fpm
。 大多数困难的任务仍然由工具照料。
结论
使用fpm
可以使您的生活更轻松试图创建程序包,您的基础设施使用或分发您的项目的公开下载的包时,当。 虽然由于政策考虑,它可能不是用于包装实际分发的存储库的理想解决方案,但其优点在许多情况下是有吸引力的。