构建二进制Deb包:实用指南

2020-06-02 22:33:01

DEB文件是包含数据的存档。它标有.deb扩展名,用于轻松分发和安装Linux Debian及其衍生产品的程序。当您的应用程序需要处理其他依赖项、与桌面集成、运行安装前和安装后脚本等时,deb文件非常方便。

在这个快速教程中,我想向您展示如何从头开始生成一个Deb包,该包将在目标系统中安装一个二进制可执行文件。让我们从一些理论背景开始吧。

Deb是一个标准的Unix ar存档,其中包含您的应用程序和其他实用程序文件。最重要的是控制文件,它存储有关deb包及其安装的程序的信息。

在内部,Deb包包含模拟典型Linux文件系统的文件夹集合,如/usr、/usr/bin、/opt等。在安装过程中,放入其中一个目录中的文件将被复制到实际文件系统中的相同位置。因此,例如,放入<;.deb>;/usr/local/bin/binaryfile的二进制文件将安装到/usr/local/bin/binaryfile。

例如,假设您想要发布名为hello的1.0版程序,该程序是为64位ARM处理器构建的。您的deb文件名类似hello_1.0-1_arm64.deb。

我们现在已经准备好生成包了。确保您的系统中安装了dpkg-deb程序:稍后将使用该程序生成最终存档。

创建一个临时工作目录以在其中放置您的软件包。遵循我们以前见过的相同命名约定。例如:

将程序文件放在目标系统上应该安装的位置。例如,假设您希望将程序安装到/usr/local/bin:

mkdir命令的-p标志将创建嵌套目录。然后将可执行文件复制到其中:

控制文件位于Debian目录中。注意大写:名为debian(Lowecase)的类似目录用于存储所谓源包的源代码。本教程是关于二进制包的,所以我们不需要它。

使用您选择的文本编辑器打开先前创建的文件。控制文件只是数据字段的列表。对于二进制包,至少有一组必需的包:

维护员-包裹维护负责人的姓名和电子邮件地址;

Package:helloVersion:1.0体系结构:arm64Maintainer:内部指针<;[email protected]>;描述:欢迎您的程序。您可以在此处添加更长的描述。注意这段开头的空白处。

控制文件可以包含附加的有用字段,例如它所属的部分或依赖项列表。如果您的程序依赖于外部库才能正常工作,那么后者是极其重要的。如果您愿意,您可以手动填写,但是有一些辅助工具可以减轻负担。在接下来的几段中,我将向您展示如何使用。

root-owner-group标志使所有deb包内容归root用户所有,这是标准做法。如果没有这样的标志,所有文件和文件夹都将归您的用户所有,而Deb软件包将安装到的系统中可能不存在这些文件和文件夹。

上面的命令将在工作目录旁边生成一个很好的.deb文件,或者如果包中有错误或缺失,则会打印错误。如果操作成功,您就有一个Deb包可以分发了。继续阅读,寻找更多的好东西!

这是一个好主意,以测试您的Deb包一旦创建。您可以像安装任何其他常规Deb软件包一样安装它:

dpkg-l命令列出所有安装的软件包,而grep搜索<;appname>;。如果应用程序已正确卸载,则输出应为空。

尤其是在处理安装前/安装后或删除脚本时,这些脚本在某些时候会失败。这是dpkg发出的典型错误消息:

软件包处于非常糟糕的不一致状态-您应该在尝试删除之前重新安装它。

这阻碍了任何进展。诀窍是将对损坏的软件包的所有引用移动到安全的地方(例如/tmp目录),然后强制删除它,如下所示:

您可以使用dpkg-shlibdeps自动生成它们。它将解析您的二进制文件并查找外部符号。在撰写本文时,该工具似乎无法开箱即用。出于某种(对我来说)未知的原因,它希望debian/control文件出现在工作目录中--这是用于源包的,记得吗?这里的解决方法是创建它,然后移到工作文件夹并运行:

-O标志将打印标准输出上的依赖项。复制输出并将其粘贴到Debian/control文件的Dependents部分。一旦完成,您就可以删除Debian/control文件。不过,我非常肯定有更好的方法可以做到这一点:一旦我得到关于这一步的更多信息,我会更新这篇文章。

四个文件:postinst、preinst、postrm和prerm称为维护脚本。这些文件位于Debian目录中,顾名思义,preinst和postinst在安装前后运行,而prerm和poststrm在删除之前和之后运行。它们必须标记为可执行文件。此外,请记住设置权限:必须介于0555和0775之间。