介绍
不同的Linux发行版使用的包装格式可能对希望以易于使用的方式发布项目的软件开发人员来说是一个痛点。 Debian 和 Ubuntu 依靠 .deb
包装,而 Fedora 和 RedHat 都使用 .rpm
风格的包装系统。
虽然分发的包维护者会为官方存储库中包含的包进行重量级提升,但如果您计划在自己的网站上发布这些分发的软件,或者需要为您的组织创建包,您通常会想自己提供包。
为了最大限度地减少这个过程的复杂性,创建了一个名为fpm
的工具,使用fpm
,你可以轻松地创建deb
和rpm
文件,而不必知道它所利用的包装工具的任何命令。
安装 FPM
我们可以通过安装 Ruby 开发包和编译额外软件所需的软件构建工具来准备安装 fpm。
首先,更新本地包缓存,然后进行先决条件的安装:
1sudo apt-get update
2sudo apt-get install ruby-dev build-essential
一旦安装上述包,您可以通过键入获得fpm
包本身:
1sudo gem install fpm
這將在系統水平上安裝「fpm」,並使其可供系統上的任何使用者使用。 傳統包裝智慧建議您作為正常的非根用戶創建包裝。
您现在应该在您的系统上使用fpm
可执行,您可以通过查看该工具丰富的帮助信息来验证这一点:
1fpm --help
1Intro:
2
3 This is fpm version 1.2.0
4
5 If you think something is wrong, it's probably a bug! :)
6 Please file these here: https://github.com/jordansissel/fpm/issues
7
8 You can find support on irc (#fpm on freenode irc) or via email with
9 [email protected]
10
11Usage:
12 fpm [OPTIONS] [ARGS] ...
13. . .
您现在可以开始构建包裹。
熟悉基本FPM功能
fpm
工具很擅长告诉你完成包构建所需的内容. 要了解最基本的要求,你可以毫无争议地调用命令:
1fpm
1Missing required -s flag. What package source did you want? {:level=>:warn}
2Missing required -t flag. What package output did you want? {:level=>:warn}
3No 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}
4Fix the above problems, and you'll be rolling packages in no time! {:level=>:fatal}
这个输出告诉我们我们需要提供的基本内容来创建一个包. 一个典型的呼叫将在其基本形式中看起来像这样:
1fpm -s source_type -t target_type source_name_or_location
源可以是多种类型的任何一种,源类型也会决定源名称或位置如何传递到命令中,我们将在下一节讨论可能的输入和输出格式。
由于我们已经安装了Ruby必需品以使fpm
工作,并且由于我们正在使用Ubuntu系统,所以将Ruby珠宝文件转换为deb
包应该是可能的。
我们可以从位于 rubygems.org 的bundler
包中创建一个.deb
包,键入:
1fpm -s gem -t deb bundler
1Created package {:path=>"rubygem-bundler_1.6.5_all.deb"}
在本地目录中创建了一个名为rubygem-bundler_1.6.5_all.deb
的文件(您的版本号码可能不同)。
1sudo dpkg -i rubygem-bundler_1.6.5_all.deb
当你检查安装的宝石列表时,你会看到我们现在有包装可用:
1gem list
1*** LOCAL GEMS ***
2
3arr-pm (0.0.9)
4backports (3.6.0)
5bundler (1.6.5)
6cabin (0.6.1)
7childprocess (0.5.3)
8clamp (0.6.3)
9ffi (1.9.3)
10fpm (1.2.0)
11json (1.8.1)
我们可以很容易地使用不同的源或输出格式,但这些需要我们的系统上一些额外的工具来转换格式。
来源和目标格式
fpm
工具可以与几个不同的源和目标格式一起工作,每个格式都有自己的要求和功能。
如果有一个格式的相对标准的包索引在网上(如 rubygems.org 用于 Ruby 宝石文件),‘fpm’ 可以自动搜索索引并下载所需的文件。
目前支持以下源类型:
出处类型 出处描述 如何通过出处名称或位置 需要++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ————————————————————————. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 将自动下载以创建软件包 。 Ruby',
rubygems-Institution' '------------------------------------------------------------------------------------------------------------------------------------------------------------------------py----------------------------------------------------------- 在 Python 包索引中查找名称,并自动下载以创建包. Python-setuptools ("python-settools") _ 梨 ("活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活活 创建软件包时, 将自动下载相应的文件 。
php-pear' |
|-cpan | A Perl 模组 |通过在cpan.org中找到的 Perl 模组名称. 文件将自动下载并用于构建软件包. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 包会被自动下载并用于制作出输出包. npm' | | Osxpkg | An OS X package |通过 OS X 软件包在本地文件系统中的位置(这只会在 OS X 系统中工作,其路径为"pkgbuilding"). QQ"pkgbuilding"(仅供OS X系统使用) QQ空 (无出处) 用于创建一个没有实际软件包的软件包. 这最常用于只包含依赖性的元包. | (无) | ( __-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
rpm ' |
您想要创建的目标包装格式也有很多选项,下面的表描述了一些不同的选项:
QQ输出类型 QQ输出描述 QQ输出描述 ADebian风格的可以安装在Debian或Ubuntu系统中的软件包 QQ(没有一台基于Debian的系统) QQ-
rpm- A RedHat风格的软件包,可以安装在CentOS,Fedora,或RedHat系统中. QQ rpm
_
_ _ zip 包含输入包的目录和文件结构的 zip 文件 。 输入包目录结构的 sip
QQ tar (压缩或未压缩) a tarball 。 (无)
| Dir| A 目录中提取已输入包。 _(无)
| sh| A自取自出 '.sh' 文件。 这是带有 bzipped tar 文件的 shell 脚本, 运行时会提取出 。 _ ( 无) _
_ _ osxpkg _ _ a package file for OS X. 您必须使用安装pkgbuilding
的OS X装置来创建这些软件包。 pkgbuilding'(仅供OS X系统使用)_ __ 适用于在Solaris系统中安装的软件包。 你必须安装 " pkgproto " 和 " pkgmk " ,这些设备只能在Solaris机器上使用。
pkgproto',pkgmk'(只在Solaris系统上提供) _ _|pkgin 适用于在BSD系统中安装的软件包。 您必须安装
pkg create软件包, 它只能在 BSD 系统中使用 。
pkg_create` (只在 BSD 系统中可用) _
__ public → 一个可安装在各种系统中的傀儡模块。 (注:此格式与当前版本的fpm不正确. ++ (无法在非工作状态下进行测试) ++
正如你所看到的,一些源和目标规格的格式需要你在一个特定的操作系统上。由于我们正在在Ubuntu 14.04上展示这个工具,所以osxpkg
源格式以及osxpkg
,solaris
和pkgin
输出格式将无法使用。
通过选项更改 FPM 行为
使用上面的表中的信息,您应该能够使用fpm
默认设置创建一些基本的包,但是,大多数时候,您将想要提供一些额外的信息,以塑造结果的包。
应在指定原始包的位置或名称的源参数之前指定选项。
对于fpm
有 many 不同的选项. 我们只会涵盖下面一些更常见的选项. 对于完整的列表,请查看fpm --help
命令。
您可能想使用的一些常见选项是:
- -C:指定在查找文件前需要更改的目录。
- -prefix:一个目录路径,指定所生成包中的文件将安装到何处.
- -p: 您的软件包名称和路径 。 这可以覆盖生成的软件包文件的文件名 。
- -n : (中文(简体) ). 您想要用于软件包的名称 。 这是您平台包装工具中显示的名称 。
- -v : (中文(简体) ). 您想要用于您的软件包的版本编号 。
- ** - 输入**: 包的发布信息. 这个号码的发售名称各有不同,但与应用程序的版本相比,它一般是跟踪软件包版本的一种方式. *-许可: 软件包的许可名称 。 这将包括软件包的元数据中的许可证类型,但不包括软件包内部的相关许可证文件.
- -类别: 此软件包所属的类别 。 这可用于在回包内组织包.
- -d: (中文(简体) ). 这可以被多次用于指定包的依赖性. *-提供: 这可用于指定此软件包提供的系统功能. 这通常用于满足一项要求的不止一种选择。
- -冲突: 用于指定不可安装的软件包 。
- -取而代之:用于指定安装此包时需要去除的包.
- **- config-files **: (中文(简体) ). 曾将包内的文件标记为配置文件. 一般来说,软件包管理器会在软件包被移除后将这些保存完好.
- -目录: 标记目录为软件包所拥有 。
*-a: 指定软件包的架构。
*-米: 覆盖软件包维护者字段 。 默认情况下, 此字段将使用
用户名@ host
。 *-e : (中文(简体) ). 在构建软件包之前手动审查和编辑 spec 文件 。 这可以用来修饰任何用于套件规格的默认值. - -描述: 设置软件包的描述 。 -后站,-后站*,-后站,-后站,-后站:应在适当时机运行的脚本文件. (英语)
还有相当多的选项,具体取决于您选择的包装格式. 如需完整列表,请查看帮助。
个性化包装
如果您想要自定义更多细节,而不想将一个格式直接翻译成输出格式,则可能需要采用不同的工作流。
这个过程将更密切地反映传统的包装,但也将提供能够快速生产多个输出格式的好处. 我们可以向您展示下面的一般工作流程,假设该应用程序使用标准的 ./configure
、 make
、 make install
编译和安装过程。
首先,安装您为该项目所需的所有依赖性,然后从其网站上获取该项目的源包,并将其放入工作目录:
1mkdir ~/build
2cd ~/build
3wget http://example.com/project.tar.gz
现在,您可以提取文件并更改到结果的目录:
1tar xzvf project.tar.gz
2cd project
在此目录中,你将有你想要包装的应用程序的源文件. 你现在有机会对文件进行一些调整,并配置一些选项。
在构建过程中指定选项的正常方法是使用包含的 ./configure
脚本. 查看项目的文档,了解哪些编译选项可用。
1./configure --compilation_option=value --another_option=value --optional_flag ...
这将创建或修改在构建包时通过做
命令读取的文件,我们现在可以通过键入创建实际的安装文件:
1make
相反,我们将安装在我们的系统上配置的这些文件,我们会将它们安装到一个空的,愚蠢的目录中,我们可以从中构建一个真正的包。
1mkdir -p /tmp/project
我们可以将这个新目录标记为 root 安装位置,通过将DESTDIR
选项转移到make install
:
1make DESTDIR=/tmp/project install
我们的包现在已经被清洁地安装到一个空的骨骼目录. 它已经创建了所有必要的目录结构,但没有什么与该目录中的包无关。
如果您希望在安装层次中添加额外的文件,您现在可以将其添加到该结构中的适当位置。
当您准备好时,您可以使用fpm
创建相应的包文件,例如,我们可以在我们的fpm
命令中输入一些版本信息和包的描述,我们还可以列出依赖信息或提供额外的细节,这些细节将影响包装元文件的创建。
我们可以使用目录结构来构建多个包装格式,例如,我们可以通过键入:
1fpm -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
包):
1fpm -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
可以使你的生活更容易,当你试图在你的基础设施中创建可使用的包,或在你的项目中分发可公开下载的包时。