如果这是dpkg-gencontrol的用途,我得到的错误是:
dpkg-gencontrol: error: Syntax error in control_template at line 7: first block lacks a source field.
作为参考,该命令是dpkg-gencontrol -v1.1 -ccontrol_template -lchangelog -Pdebian. control_template文件包含:
Package: my-package Maintainer: Joe Coder <joe@coder.com> Description: The my-package system A longer description that runs to the end of one line and then extends to another line. Priority: optional
如果这不是dpkg-gencontrol的用途,是否有人对我能做什么有任何建议,或者建议如何设置依赖列表,理想情况下是自动的?
不可否认,以一般方式推断依赖关系可能是一个非常困难的问题,特别是如果您将搜索扩展到脚本和其他程序.我希望有一些工具可以在大多数时间使用.
请注意,这仅适用于内部分发.我没有构建一个程序包进入Linux发行版,甚至没有公众下载,所以我很乐意在需要时修改/破坏标准规则.
解决方法
运行dpkg-shlibdeps -O< executable>导致需要为要运行的可执行文件安装的软件包和版本的列表.完善.几乎.理想情况下,dpkg-gencontrol可以在其处理中使用它,它声称能够通过其变量替换功能来完成.
为了顺利实现这一点,我必须创建一个与Debian打包工具的期望相匹配的目录结构.看起来基本上是这样的:
my_project_directory/ main.c (or other source code,etc.) debian/ changelog (created by hand; see below) control (this is basically a template,created by hand; see below) files (created by dpkg-gencontrol) substvars (created by dpkg-shlibdeps and used by dpkg-gencontrol) tmp/ (tmp is the root of the target system's filesystem) path/ to/ my/ project/ executable_1 (this will be installed at /path/to/my/project) executable_2 (this,too) var/ www/ index.PHP (this will be installed at /var/www on target systems) DEBIAN/ (create this by hand) control (created by dpkg-gencontrol and used in the final package)
请注意,Debian打包工具在debian / tmp /下保留所有文件的所有者和组.因此,如果您希望在安装时拥有root或其他用户拥有的文件,那么事情会变得棘手.一种选择是以root身份准备debian目录树,并根据需要设置所有者.如果您不希望以root身份运行,或者不允许运行,则还有另一种方法.
创建一个调用chown等的脚本来调整所有权,最后一行是dpkg-deb -b debian / tmp. (构建.deb包,请参阅下面的示例).通过另一个Debian工具fakeroot运行它,如下所示:fakeroot ./fix_ownerships_and_build.sh. Fakeroot让程序的行为就像它们是root用户一样,而不会像root用户那样实际改变事物.它是为这种情况而创建的.
我调查了为什么dpkg-gencontrol生成“第一个块缺少源字段”错误,甚至可以读取它的Perl源代码.正如经常发生的那样,错误代码是精确的,没有提供足够的上下文来知道该做什么:控制文件确实需要一个名为“source”的字段,在其第一个(两个)块中.
有两种Debian软件包,源代码和二进制代码.我以为我需要二进制文件,因为我只想将已编译的可执行文件放入其中,但我无法使用它.我尝试了一个源包,并在我的控制文件中添加了一个源字段.这摆脱了“第一块缺少源场”的错误,但导致了另一个.更仔细地阅读文档,我意识到源代码在其控制文件中打包了need two “paragraphs”.一旦我将控制文件更改为这样,它就开始起作用了(差不多):
Source: my-package Maintainer: Joe Coder <joe@coder.com> Package: my-package Priority: optional Architecture: amd64 Depends: ${shlibs:Depends},apache2,PHP5 Description: The My-Package System A longer description that runs to the end of one line and then extends to another line.
仍然缺少的是changelog文件.这是一个文件,用于保存包的发布历史记录,包含重大更改,版本号,日期和负责人.我通常以自己的格式维护这样的东西,我仔细地将其转换为严格的Debian更改日志格式.出于某种原因,更改日志在最终包中被省略,因此我单独保留了历史文件并使用了占位符,如下所示:
my-package (1.0) unstable; urgency=low * placeholder changelog to satisfy dpkg-gencontrol -- Joe Coder <joe@coder.com> Thu,3 Nov 2011 16:49:00 -0700
带有*的线路上的两个前导空间是必不可少的,就像带有 – 的线路上的单个前导空间一样,电子邮件地址和日期之间的两个空格也是如此.是的,日期需要精确,时区和所有,即使它不需要准确.
将所有内容放在一起,如上所述设置debian目录树,构建包所需的命令序列如下:
dpkg-shlibdeps debian/tmp/path/to/my/project/executable_1 \ debian/tmp/path/to/my/project/executable_2 dpkg-gencontrol -v1.1 (or whatever version you are building) fakeroot ./fix_ownerships_and_build.sh
fix_ownerships_and_build.sh看起来像这样:
chown -R root:root debian/tmp/path (or whatever user is appropriate) chown -R www-data:www-data debian/tmp/var/www/* (same goes here) dpkg-deb -b debian/tmp . (this leads to a nice my-package_1.1_amd64.deb file)
就是这样了.希望这个答案能帮助其他人比我更快地取得进步.