内容


创建 Debian Linux 软件包

学习如何为 Debian 用户构建易于分发的软件包

Comments

就安装、升级和除去软件而言,Debian 打包系统是可以使用的最佳方法之一。对于喜欢其它打包系统的人,在提出抗议之前,请注意我说的是“之一”而不仅仅是“最”。其它打包系统各有千秋,但在本文中我将集中讨论 Debian 打包系统。具体地说,我将讨论如何创建 Debian 软件包以便您可以以 Debian 格式分发软件包 — 或者仅仅为自己使用而创建软件包。

我将完整地介绍软件包的基本组件,创建自己的软件包所需的东西以及如何将它们组合在一起来创建一个软件包。

理解 Debian 软件包

在这一节中,我们将简要地了解一下何为 Debian 软件包。Debian 软件包很象 RPM(Red Hat 软件包管理器,Red Hat Package Manager)软件包,但在细节上二者有些不同。如果您曾经创建过 RPM,那么您可能会发现向您的清单中添加 Debian 打包一点也不难。

软件包到底是什么?

简而言之, 软件包就是一个文件及文件处理指令的集合。软件包通常包含一个或多个程序,但有时它却只包含文档、窗口管理器主题或其它易于用可安装软件包分发的文件。

软件包包含如下几方面的指令:这些文件应该驻留在文件系统中的什么地方,软件包的内容依赖(如果有的话)哪些库或哪些别的程序,安装指令以及基本配置脚本。注:对于许多软件包而言,不能或不应该用其配置文件中所含的缺省设置来使用它们。对于诸如 Apache 之类的软件包,您在安装了该软件包之后,仍然需要配置您的安装。

软件包通常包含的是预编译的软件,但您也可以打包源代码。因为有些管理员可能更喜欢从源代码开始安装,也可能因为您的应用程序在编译之前需要做些定制工作,所以如果您以免费或开放源码许可证分发软件,那么您可能希望同时创建源代码软件包和“二进制”软件包。

:预先编译的软件包通常称为“二进制文件”,尽管这不很贴切。的确,可执行文件 二进制格式的,但 JPEG、MP3 和其它许多不可执行文件也是二进制格式的。将预先编译的软件称为“可执行”软件包可能更有意义。

所有二进制 Debian 软件包都由三个基本部分组成:一个称为 debian-binary 的文本文件、一个名为 control.tar.gz 的压缩 tar 包(tarball)和另外一个名为 data.tar.gz 的压缩 tar 包。

debian-binary 文本文件包含二进制软件包的版本号,该版本号应该是 2.0 。control.tar.gz 文件包含控制文件、postinst 文件和 prerm 文件,postinst 文件包含了有关在安装了该软件包后如何做的指令,而 prerm 文件则包含了除去指令。control.tar.gz 可能还包括另外两个文件:一个文件名为 conffiles,包含有关软件包配置文件的信息,另一个名为 md5sums,包含软件包的 MD5 校验和。

data.tar.gz 包含软件包的实际“有效载荷”。即,它包含一个带有您程序全部相关文件的文件系统,这些文件在安装时会被放到您系统的文件系统中适当的位置。

如果您想亲自看看软件包是什么样的,那么请从 Debian 站点(请参阅本文后面的 参考资料中的链接)下载一些软件包,然后运行 ar -x packagename.deb 。Debian 软件包只是上面提到的文件的归档。

我必须是 Debian 开发人员吗?

创建和分发与 Debian 兼容的软件包并不需要您是一名正式的 Debian 开发人员。不过,您 确实需要是 Debian 开发人员及软件包维护人员,以便分别进行实际的软件包上载和正式的 Debian 发行版的维护。如果您对成为 Debian 开发人员感兴趣,那么您可以从阅读 Debian 网站(请参阅 参考资料以获取链接)上的“How You Can Help?”页面入手。

有不少公司和项目都创建和分发其软件的 Debian 软件包。这些都不是“正式的”Debian 软件包,但它们仍然为希望能够使用 dpkg 或 APT(高级打包工具,Advanced Packaging Tool)安装软件的 Debian 用户带来了极大的便利。

着手工作需要什么

显然,如果您想创建和测试 Debian 软件包的话,那么您需要一个流行的 Debian 系统。您还需要一些东西供打包。我们将先假设您已经有了这两样东西,然后继续我们的工作。

要在 Debian 系统上构建软件包,您需要先安装几个软件包。可能会缺省安装其中的大多数软件包,因为不管怎样,在大多数系统上您都需要进行 dpkg、gcc 和 make 等操作。您还需要 build-essential 软件包和 dpkg-dev 软件包,它们可能已经安装在您的系统上,也可能还没有安装。

Debian 软件包命名约定

如果您曾用过 Debian,那么您可能已经注意到了:Debian 软件包文件都遵循一定的命名约定。所有 Debian 二进制软件包都应该具有符合以下格式的文件名:packagename_version_arch.deb,其中“packagename”是软件包的名称,“version”是带有主、次和修订号的软件包版本,而“arch”是软件包的体系结构。

软件包本身的名称(不是文件名,仅仅是软件包的名称)可以包含小写字母、数字以及“-”和“+”字符。(软件包的名称中包含“+”,这听起来很奇怪,但有几个软件包已经使用了“+”,如“doc++” — C/C++ 代码的文档系统。)因此,“mypackage-2++”是完全有效的软件包名称,而“MY_Package”或“mypackage2.0”则不是。

每个软件包还应该有一个唯一的名称,并且这个名称不能已经存在于 Debian 归档。尽管从技术上来说,要安装的软件包无须遵循这一约定,但您应该确保软件包名称不与某个正式 Debian 软件包冲突。例如,如果您想分发一个经过特别修补的 Apache 版本来替换正式的 Debian 版本,那么您就不应该使用 apache_X.X.X-i386.deb,因为 Debian 系统中已经有一个 apache软件包。而是应该使用类似 acme-apache_X.X.X-i386.deb 的名称。

创建 Debian 软件包

既然我们已经介绍了基础知识、何为软件包以及您需要什么,现在该讨论构建软件包的细节了。

控制文件

您需要为软件包创建一个控制文件。别急;这并不太难,创建文件仅仅需要您最喜欢的文本编辑器和少许信息而已。以下是一个样本控制文件。注:出于演示的目的,我在这里包含了全部可选字段 — 您的软件包可能并不需要所有这些字段。

清单 1. 样本控制文件
Package: acme
Version: 1.0
Section: web 
Priority: optional
Architecture: all
Essential: no
Depends: libwww-perl, acme-base (>= 1.2)
Pre-Depends: perl 
Recommends: mozilla | netscape  
Suggests: docbook 
Installed-Size: 1024
Maintainer: Joe Brockmeier <jzb@dissociatedpress.net>
Conflicts: wile-e-coyote
Replaces: sam-sheepdog
Provides: acme
Description: The description can contain free-form text
             describing the function of the program, what
             kind of features it has, and so on.
.
More descriptive text.

控制文件字段

控制字段的语法非常简单:字段名称,后跟冒号,再后面是字段体或值。因此,“Fieldname: value”就是您所需的全部语法。有些字段需要的值为一个单词,而另外一些字段允许值为自由格式的描述或值集合。

在这一节中,我们将研究控制文件中每个字段的含义,以及需要提供何种信息。这些字段中的大多数都是可选的,因此如果有某些字段与您的软件包无关,那么您的软件包就 须包含所有这些字段。例如,如果某个软件包的源代码不可用,那么该软件包就不需要“Source”字段。如果您的软件包不与任何其它软件包冲突,那么您就不需要包含“Conflicts”信息,等等。

任何控制文件中的第一个字段都是“Package”字段。您将在这个字段中指定软件包的名称。接下来的“Version”字段是软件包的版本号。您可以使用软件包的原作者所使用的任何版本编号模式,但是其中不能包含连字符。连字符后的任何内容都被看作是 Debian 修订号。例如,如果因某种原因而将程序的原版本号给定为 1.01-1,那么将认为版本号为“1.01”,Debian 修订号为“1” — 显然,该版本号不是您期待的结果。

“Maintainer”字段应该是您的全名(或公司名称)和由尖括号括起来的电子邮件地址(如上所示)。“Installed-Size”则是不说自明。

相关性

正如您可能已经知道的那样,Debian 软件包最优秀的一个方面在于相关性解析。当您使用 apt-get 来检索软件包时,它自动确定系统上是否有使用所请求的软件包所需要的东西,对任何存在的冲突进行解决,或者检索您所需的任何软件包。该功能依赖于在软件包中合理地规划并正确地设置了软件包的相关性。

有几个处理相关性的可选字段。我们将在这里简要地介绍其中的每个字段。在安装之前请务必准确挑选出您的软件包可能依赖于哪些软件包 — 相关性系统的聪明程度依赖于开发人员给予它的信息的多少。

在控制文件中相关性包括五个字段:Depends、Enhances、Pre-Depends、Recommends 和 Suggests。

Depends 字段应该包含您的软件包正常工作绝对必需的任何软件包的名称。如果有一个“最好有”软件包与您的软件包有关,但却不是它正常运行所必需的,那么您应该对该软件包使用“Recommends”或“Suggests”字段。在上面的示例中,您会注意到:“Recommends”字段有两个由竖线( | )分开的独立软件包。这意味着两者都满足相关性;但都不是必需的。

那么“Recommends”和“Suggests”之间的区别又在哪里呢?可能会用到但又不是绝对必需的任何软件包都属于“Recommends”字段。根据策略手册,“列出在除非寻常安装以外的任何安装中与此软件包一起出现的软件包。”可能有用但在任何情况下都不是必需的软件包应该列入“Suggests”字段。

例如,DocBook XML DTD 软件包(docbook-xml)将 DocBook SGML(docbook)软件包列为推荐软件包,而将 DocBook 文档(docbook-doc)列为建议软件包。在大多数情况下,如果您有 XML DTD,那么您可能也有 SGML DTD — 但不是在所有情况下都这样。安装某个软件包或相关程序的文档通常(应为:总是)是个好主意,如安装 DocBook 文档,但这不是程序正常操作所必需的。

“Enhances”字段主要表明您的软件包可能使另一个软件包更有用。因此,docbook-doc 软件包可能有一个“Enhances”字段,该字段包含了 docbook-xml 作为其增强软件包之一。

“Pre-Depends”是为特例而保留的。当某个软件包被作为“Pre-Depends”列出时,它强制系统在试图安装您的软件包之前完全安装所指定的软件包。

最后,在使用版本号时,有几个符号需要理解。您会注意到,作为相关性列出的某个软件包给出了一个版本号, acme-base (>= 1.2) 。这意味着,“该软件包要求软件包 acme-base 版本等于或高于 1.2”。

可用的关系有“远远低于”( << )、“低于或等于”( <= )、“ 等于”( = )、“等于或高于”( >= )以及“远远高于”( >> )。

指定冲突

“Conflicts”和“Replaces”字段指定非相关的软件包,而不是不与您的软件包同时属于同一系统的软件包。

与您的软件包完全冲突的软件包应该列入“Conflicts”字段。例如,如果您对修订版 Apache 进行打包,那么您不希望正常版本的 Apache 与您的修订版本都处于一个系统上 — 因此“apache”将被列为冲突。

最后,控制文件应该被置于名为 DEBIAN 的目录下,如同我们将在下一节中讨论的那些脚本一样。该目录不会出现在最终的 Deb 归档中。

脚本

在安装和除去软件包时,您的软件包还需要一些由系统运行的脚本。(记住,无论您的程序多么好,都可能会有人随后希望卸载它。)

postinst 脚本应该含有在安装完程序之后将要执行的任何必要步骤。 prerm 脚本应该包含删除程序应该进行的操作的指令。这两个脚本都是必需的(请参阅 参考资料以获取更多这方面的信息)。

最后一步

在完成制作 Debian 软件包的所有准备工作之后,实际的软件包创建工作就有些虎头蛇尾了。

您将使用带有 -b--build 选项的 dpkg 命令( -b--build 是相同的)。创建软件包的语法为 dpkg -b directory packagename.deb ,其中 directory 包含文件系统树,该文件系统树含有程序的全部必需文件。注:构建软件包时您可以不指定新软件包的名称,但这样做只是将软件包文件作为“.deb”放在 directory 下面 — 这可能会使您认为完全没有创建软件包。

因此,举例来说,如果您的程序有一个配置文件(属于 etc/)、程序本身(位于 usr/bin/)以及一些位于 usr/share/doc/package/ 下面的文档,那么您将在用来创建软件包的目录下重新创建该文件系统树。

基础知识以外

对于创建 Debian 软件包,这些已经够多了。看起来有点儿复杂,但它们实际上只是一些简单的步骤。没有什么太复杂的东西;您只需将它们设置正确。

创建软件包的有些复杂性已经超出本文的范畴。例如,如果您正在对一个邮件用户代理程序或邮件传输代理程序进行打包,那么有些特定的考虑事项适用于这种情形。本文仅仅涵盖了创建 Debian 软件包的最基本的知识。务必要查阅 Debian Policy Manual(请参阅 参考资料以获取链接)以确保您完全遵循软件包指南。

有几类程序需要特别注意,包括任何 Web 服务器、守护程序、Perl 程序或模块及 X 程序等等。您将在策略手册的 Customized Programs 一节中找到您需要了解的内容。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=22212
ArticleTitle=创建 Debian Linux 软件包
publish-date=09012003