如何创建一个安装一系列文件的deb软件包。

我想创建一个全新的deb软件包来安装一系列文件。如果可能的话,我希望在安装过程中将包含这些文件的文件夹解压到已知的文件夹位置。如果无法实现这一点,了解如何打包源文件夹和文件将非常有用。
问题是 - 这是否可能,如果可能的话 - 如何实现?
让我们举个例子: ~/mypluginfolder/ 包含文件 xy,一个名为 abc 的子文件夹,以及其中的另一个文件 z
我想将这个文件夹打包成: tar -cvf myfiles.tar ~/mypluginfolder 我推测我的Debian软件包应该是这样的。
myfiles.tar.gz
myfiles+ppafoss_0.1-1/
   myfiles.tar
   DEBIAN
      changelog, compat, control, install, rules source

有没有办法将myfiles.tar解压到已知的文件夹位置,例如?

/usr/share/rhythmbox/plugins/

因此,最终结果将是:
/usr/share/rhythmbox/plugins/mypluginfolder
/usr/share/rhythmbox/plugins/mypluginfolder\x
/usr/share/rhythmbox/plugins/mypluginfolder\y
/usr/share/rhythmbox/plugins/mypluginfolder\abc\z

如果 - 假设发射台需要源代码,那么请告知我应该将源文件夹和文件放在deb软件包结构的哪个位置。
这最终将成为一系列独立的Launchpad PPA软件包。
我希望(但可能无法实现...)尽量减少打包 - 从模板创建一系列软件包,并调整最少的内容(changelog等+tar文件/文件夹结构)。

嗯...你为什么想要一个.deb文件来进行tar解压呢?为什么不直接从tar中获取源代码,然后用源代码从头开始创建.deb文件呢? - Thomas Ward
2一个可能性是你可以像下载Adobe Flash那样,从其他地方wget这个tarball文件。 - jrg
@jrg,那个下载的是.bin安装程序,不是tarball。Adobe的打包风格没有提供源代码(它是闭源的)。但概念仍然相同,从其他地方下载代码,然后解压/安装(我这里有点挑剔哈哈) - Thomas Ward
@时间之主 无所谓啦。 ;p - jrg
1个回答

以下,我假设源代码是开放的(例如Python脚本),因此不受任何架构限制(例如amd64或i386),因此使用"all"。如果您有一些C源代码,则需要在您的源代码的"control"文件中使用Architecture: amd64 i386

为Launchpad创建准备好的软件包

最终这将成为一系列独立的Launchpad PPA软件包。

我希望(但可能无法实现...)尽量保持我的打包工作最简化 - 从一个模板创建一系列软件包,并调整最基本的部分(如changelog等和tar文件)。

Launchpad只接受源代码软件包,因此需要创建一个rules文件,将文件安装到正确的位置。为了方便起见,我将使用debhelper。您的文件目录应该如下所示:

debian/changelog
debian/control
debian/rules
debian/compat
mypluginfolder/...

一个 `debian/copyright` 文件也可以用来向用户提供有关软件包许可证的信息。我认为你不需要一个 `postinst` 脚本,因为你只需要提取一些文件。`compat` 应该包含 debhelper 的兼容性级别,比如 "8"。(请参考debhelper 手册页面获取更多详细信息)
`changelog` 文件可以使用 `devscripts` 软件包中的 `dch` 命令进行编辑。`rules`(使用 debhelper)应包含以下内容:
#!/usr/bin/make -f
%:
    dh $@
override_dh_install:
    dh_install mypluginfolder/ /usr/share/rhythmbox/plugins

使用chmod 755 debian/rules使其可执行。可以使用debuild -S构建源包。请确保在名为<package-name>-<version>的目录中。有关override_行为和dh命令的更多信息,请参见其手册页面

Debian新维护者指南对我理解这一点非常有价值,建议阅读。示例包装可在https://github.com/Bumblebee-Project/bumblebee-ppa上找到。


从现有文件树创建软件包

dpkg-deb -b 可用于从现有文件树创建tarballs。首先,开始创建一个应该以您的软件包命名的目录。我假设您想将其命名为myplugin,并将其放在/usr/share/rhythmbox/plugins/mypluginfolder中。此外,创建DEBIAN目录(大写!)以存储软件包信息:

mkdir -p myplugin/usr/share/rhythmbox/plugins/mypluginfolder
mkdir myplugin/DEBIAN

复制您的文件:
cp -r ~/mypluginsfolder myplugin/usr/share/rhythmbox/plugins

接下来,您需要一个位于myplugin/DEBIAN/control的所谓控制文件,该文件描述了软件包的信息。以下是该文件的内容:
Package: myplugin
Version: 1.0-1
Maintainer: You <whatever@contact.address>
Architecture: all
Description: plugins for Rhythmbox
 Longer description here
 .
 As you can see, new paragraph are split by a single dot,
 and lines have to be indented by one space.

现在,您可以选择验证软件包的内容。下一个命令将列出myplugin的文件和目录条目内容:
find myplugin -ls

如果您满意的话,请在当前目录中构建该软件包:
dpkg-deb -b myplugin .

会出现一个新的文件,命名为<package>_<version>_<architecture>.deb,例如myplugin_1.0-1_all.deb。您可以使用less程序来查看文件内容。例如,less myplugin_1.0-1_all.deb

3+1 绝对的天才 - 我向您致敬。谢谢! - fossfreedom
非常感谢您的帮助!虽然在控制文件方面遇到了一些麻烦,但最终还是解决了,不过别问我怎么做到的 ;) - Gerhard Burger