0

我制作了一个 perl 脚本,从头开始创建一个 deb 二进制包。我创建了数据、控件等。但是当我在我的 deb 包上运行 dpkg -i 时,它抱怨它无法从数据中提取文件。示例:无法创建“.dpkg-new”(处理“”时):没有这样的文件或目录。

我已经下载了一些 .deb 包来查看,它们不使用 preinst 脚本来创建目录结构。

我在想我做错了什么,我考虑必须在 preinst 中创建我自己的目录,但它似乎不正确......也许我错过了什么?

我是否必须创建目录,将我的数据文件复制到 preinst sh 中,或者 dpkg 应该这样做而我做错了什么?

4

5 回答 5

4

我在编写的 Ruby 脚本中遇到了同样的问题。

在构建 data.tar.gz 存档时,我正在生成要传递给 tar 的文件列表。当我手动解压缩并解压缩存档时,它会很好地放气,但 dpkg 会失败。

事实证明,文件列表还必须包括要创建的每个目录。

请注意,当我创建 data.tar.gz 时,我使用与 dpkg-deb/build.c 在 dpkg-1.15.8.11 源代码中几乎相同的选项构建它。

execlp(TAR, "tar", "-cf", "-", "--format=gnu", "--null", "-T", "-", "--no-recursion", NULL);

相反,我使用

IO.popen("gnutar -czf - --format=gnu -T - --no-recursion", "r+")

于 2012-01-19T09:15:54.470 回答
2

除了@Arrowmaster 所说的,请查看http://www.debian.org/doc/debian-policy/以获取文件的一些详细说明。在构建包本身之后,您可以使用lintian工具检查它,看看是否有任何明显的您可能遗漏的内容。

于 2011-01-22T22:15:03.440 回答
2

如果有人在寻找问题的解决方案:
“从 rpm 规范文件构建 deb 包。”
看这里http://www.deepnet.cx/debbuild/

我已经使我自己的 perl 构建脚本比上面提到的要简单得多,所以我可以轻松地维护它。

在此过程中获得了一些有用的知识:
0. deb 是一个包含 3 个文件的 ar 存档,文件的顺序很重要。
1. control.tar.gz 中的脚本必须是可执行的。
2. 如果目录不存在,最好有一个预安装脚本来创建目录。
3. 有时 dpkg 决定解压缩您的 zip(如果 zip 是 data.tar.gz 中的唯一文件,则会发生这种情况),因此请在安装后脚本中检查。
4. 当你 tar.gz 一些文件时,一定要 chmod 到包含你的 tar 目录结构的目录。

于 2011-02-02T05:10:58.377 回答
1

您不应尝试手动创建 .deb 二进制包。Debian新维护者指南介绍了如何使用正确的工具开始创建 Debian 软件包。

您手工创建的软件包对您来说可能看起来是正确的,但是因为它没有安装它显然存在缺陷,无论是您没有注意到的小问题,还是您看不到的更严重的方式(例如,大多数人都没有意识到) .deb 实际上是一个 ar 存档)。

于 2011-01-22T06:03:44.147 回答
1

这有很多原因。你真的需要运行:

dpkg -i -D1110 mydeb.deb

并发布结果,希望有人能够解决问题。

于 2012-06-20T02:01:15.270 回答