dpkg-deb 构建了无效的包

dpkg-deb 构建了无效的包

我想要创建一个包含 Python 程序的简单 Debian 包(foo)。

$ ls -R dist/
dist/:
DEBIAN  usr

dist/DEBIAN:
control

dist/usr:
local

dist/usr/local:
bin

dist/usr/local/bin:
foo

$ cat dist/DEBIAN/control 
Package: foo
Version: 0.0.0
Architecture: amd64
Maintainer: ...
Depends: gettext, python-pip, tar
Section: admin
Priority: optional
Description: ...

当我dpkg-deb在 Debian 9 上使用时,会创建一个有效的包:

$ dpkg-deb --version
Debian 'dpkg-deb' package archive backend version 1.18.24 (amd64).
...
$ dpkg-deb -b dist foo.deb
...
$ dpkg-deb -c foo.deb
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/bin/
-rwxr-xr-x gerald/gerald  3786 2017-12-28 13:51 ./usr/local/bin/foo

但是当我在 Ubuntu 14.04 上使用相同的命令时,无法安装该包:

$ dpkg-deb --version
Debian `dpkg-deb' package archive backend version 1.17.5 (amd64).
...
$ dpkg-deb -b dist foo.deb
...
$ dpkg-deb -c foo.deb
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./DEBIAN/
-rw-r--r-- gerald/gerald   297 2017-12-28 13:51 ./DEBIAN/control
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/bin/
-rwxr-xr-x gerald/gerald  3786 2017-12-28 13:51 ./usr/local/bin/foo
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/bin/
-rwxr-xr-x gerald/gerald  3786 2017-12-28 13:51 ./usr/local/bin/foo
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/bin/
-rwxr-xr-x gerald/gerald  3786 2017-12-28 13:51 ./usr/local/bin/foo
drwxr-xr-x gerald/gerald     0 2017-12-28 13:51 ./usr/local/bin/
-rwxr-xr-x gerald/gerald  3786 2017-12-28 13:51 ./usr/local/bin/foo
-rwxr-xr-x gerald/gerald  3786 2017-12-28 13:51 ./usr/local/bin/foo
$ sudo dpkg -i foo.deb
(Reading database ... 430408 files and directories currently installed.)
Preparing to unpack foo.deb ...
Unpacking foo ...
dpkg: error processing archive foo.deb (--install):
trying to overwrite '/DEBIAN/control', which is also in package bar
Errors were encountered while processing:
foo.deb

答案1

首先,我要指出的dpkg-deb是:黑客式的制作软件包的方法。它只遵循最低限度,并依赖现有的系统库作为构建依赖项。因此,它不是一种非常可靠的方法创造由于这个原因以及其他原因(例如dpkg由于给定系统所需的 Debian 标准导致版本和要求不一致),您希望在特定系统之外分发这些软件包。

这就是为什么 Ubuntu 打包指南建议完全pbuilder按照新软件包的模板来构建软件包dh_make(实际上,它从 Debian 打包指南中提取了一些数据,呵呵)


现在,我采取了非常基本包装方法如下,制作了一个非常简单的包,仅包含一个脚本

您会注意到我的目录中还有更多内容DEBIAN/。这里的大多数文件都是用创建的库存文件,dh_make就好像我开始遵循打包指南来创建包一样。但是,我只是将debian/它创建的重命名为DEBIAN/,保留了install文件,但明确告诉它我需要它在安装时做什么,保留文件是postinst因为我太懒了,在chmod +x安装之前运行脚本(因此postinst脚本会将其设置为可执行文件),等等。您可以自行查看具体细节。

现在,有了上述包“结构”,在 14.04 LXD 容器中(因为我到处运行 16.04,所以 LXD 镜像可以帮助我使用旧版本进行测试),我运行后dpkg-deb发现了一些好现象:

root@trusty-deb-tests:~/temptests# dpkg-deb -b testingdata-0.0.1/
dpkg-deb: warning: 'testingdata-0.0.1//DEBIAN/control' contains user-defined field 'Build-Depends'
dpkg-deb: warning: 'testingdata-0.0.1//DEBIAN/control' contains user-defined field 'Standards-Version'
dpkg-deb: warning: ignoring 2 warnings about the control file(s)

dpkg-deb: building package `testingdata' in `testingdata-0.0.1.deb'.
root@trusty-deb-tests:~/temptests# ls
testingdata-0.0.1  testingdata-0.0.1.deb
root@trusty-deb-tests:~/temptests# dpkg-deb -c testingdata-0.0.1.deb
drwxrwxr-x root/root         0 2017-12-28 15:09 ./
drwxrwxr-x root/root         0 2017-12-28 15:09 ./dist/
-rw-r--r-- root/root        15 2017-12-28 15:09 ./dist/hellothere.sh
root@trusty-deb-tests:~/temptests#

首先,我相信某物你的软件包中有些奇怪。即使我删除了我这边除了控制文件之外的所有内容,它仍然工作正常,尽管它不知道如何写入文件,也不知道如何用我的“测试”写入正确的位置。

您的软件包中有一些特定内容被破坏了。我建议您从我链接的 GitHub 存储库中的基线开始,然后从那里开始。(将文件install放在DEBIAN文件夹中也是很好的做法,这样您就知道在哪里安装了什么)。

相关内容