我想要创建一个包含 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
文件夹中也是很好的做法,这样您就知道在哪里安装了什么)。