从脚本或二进制文件创建一个.deb软件包

我搜索了一个简单的方法来创建没有源代码需要编译的.deb软件包(配置文件、shell脚本、专有软件)。这是一个相当大的问题,因为大多数软件包教程都假设你有一个想要编译的源代码tarball。然后我找到了这个简短的教程(德语)。
之后,我创建了一个小脚本来创建一个简单的软件仓库。就像这样:
rm /export/my-repository/repository/*
cd /home/tdeutsch/deb-pkg
for i in $(ls | grep my); do dpkg -b ./$i /export/my-repository/repository/$i.deb; done
cd /export/avanon-repository/repository
gpg --armor --export "My Package Signing Key" > PublicKey
apt-ftparchive packages ./ | gzip > Packages.gz
apt-ftparchive packages ./ > Packages
apt-ftparchive release ./ > /tmp/Release.tmp; mv /tmp/Release.tmp Release
gpg --output Release.gpg -ba Release

我将密钥添加到apt密钥环并像这样包含了源:

deb http://my.default.com/my-repository/ ./

看起来仓库本身运行良好(我遇到了一些问题,为了解决它们,我需要添加两次Packages并对Release文件进行临时文件处理)。我还将一些下载的.deb文件放入了仓库,看起来它们也没有问题。但是我自己创建的软件包却不行...当我执行sudo apt-get update时,它们会导致如下错误:
E: Problem parsing dependency Depends
E: Error occurred while processing my-printerconf (NewVersion2)
E: Problem with MergeList /var/lib/apt/lists/my.default.com_my-repository_._Packages
E: The package lists or status file could not be parsed or opened.

有人知道我做错了什么吗?
更新 2012-03-06:给另一个正在寻找创建DEB包简便方法的人一个提示:看看FPM

你是否在软件包中添加了一个包含字段 Depends: 的 DEBIAN/control 文件? - Bilal Akhtar
5顺便说一句。现在我正在使用FPM满足我的打包需求:https://github.com/jordansissel/fpm - Thomas Deutsch
就我所知,我在一个我构建的软件包上得到了相同的错误信息,因为我错误地指定了其中一个依赖项。我写成了 "foo >= 2.1",而应该是 "foo (>= 2.1)"。在我意识到错误信息的前半部分正是告诉我问题所在之前,我花了一个多小时仔细查看了错误的后半部分...(附注:FPM 真棒。你也可以看看 Aptly。) - Mark E. Haase
2我非常同意,确实没有关于如何打包不来自tar ball和make文件等的东西的教程或指南。这让人很难弄清楚该怎么做。我们需要这样的指南,适合像Java开发人员这样的人,他们想要分发一个带有一些脚本和可能是Liquibase的war文件,但他们并不是Debian系统管理员或Debian维护者。在这种情况下,FPM并不能提供帮助,因为它也需要你已经知道如何创建可以被打包的东西。 - John Little
1非常感谢您分享有关fpm的信息。它真是太棒了,效果非常好! - Damian Nadales
1个回答

你所链接的教程使用了一种低级的方法来构建一个软件包。这种方法通常不被推荐,并且如果不小心处理可能会导致各种问题。
一旦你理解了打包基础知识,为脚本创建一个 .deb 文件非常简单。 简而言之:
# Configure your paths and filenames
SOURCEBINPATH=~
SOURCEBIN=myscript.sh
DEBFOLDER=~/somescripts
DEBVERSION=0.1

DEBFOLDERNAME=$DEBFOLDER-$DEBVERSION

# Create your scripts source dir
mkdir $DEBFOLDERNAME

# Copy your script to the source dir
cp $SOURCEBINPATH/$SOURCEBIN $DEBFOLDERNAME 
cd $DEBFOLDERNAME

# Create the packaging skeleton (debian/*)
dh_make -s --indep --createorig 

# Remove make calls
grep -v makefile debian/rules > debian/rules.new 
mv debian/rules.new debian/rules 

# debian/install must contain the list of scripts to install 
# as well as the target directory
echo $SOURCEBIN usr/bin > debian/install 

# Remove the example files
rm debian/*.ex

# Build the package.
# You  will get a lot of warnings and ../somescripts_0.1-1_i386.deb
debuild

添加更多脚本需要将它们复制到目录并添加到debian/install文件中,然后重新运行debuild。您还应根据需要检查和更新debian/*文件。
您应该阅读以下手册页面:dh_makedh_installdebuild

看起来不错。我得到了一个_amd64 deb包。由于这些脚本不是特定于架构的,我该怎么做才能获得适用于所有架构的deb包呢? - Thomas Deutsch
4请编辑debian/control文件,将"Architecture: any"改为"Architecture: all"。别忘了将问题标记为已回答 ;) - João Pinto
谢谢 :) 是的,既然问题已经回答了,我会标记答案的 ;) 我只是想先试一下。 - Thomas Deutsch
当我更新我的脚本时,除了将目录重命名为新的版本号并更新debian/changelog之外,我还需要做其他事情吗? - Thomas Deutsch
3除了重命名目录和更新debian/changelog之外,您还必须创建与新版本对应的.orig归档文件,这是源目录内容的一个归档(不包括debian/)。 - João Pinto
谢谢...在路径中包含源目录还是不包含?(我的意思是:在压缩之前先cd到源目录吗?) - Thomas Deutsch
1有了目录包括,我通常做的是这样的:复制源目录到sourcedir.orig,然后删除sourcedir.orig/debian,并用tar命令将其打包成filename.orig.tar.gz。 - João Pinto
1dh_make 命令中添加 --indep 标志将使软件包成为“Architecture: all”。另外,在 11.04 及以上版本中不存在 -b 标志。 - andrewsomething
1жһ„е»ә.debиҪҜ件еҢ…еҗҺпјҢжӮЁеә”иҜҘдҪҝз”Ёlintian somescripts_0.1-1_i386.debжҲ–lintian package-source.changesжЈҖжҹҘй”ҷиҜҜе’Ңж”№иҝӣ - иҜ·еҸӮйҳ…пјҡhttp://packaging.ubuntu.com/html/packaging-new-software.html#next-steps - rubo77
如果你想以后在Launchpad上创建一个Ubuntu PPA,你应该使用debuild -us -uc -k'YOUR GPG KEY'来对其进行签名,以便上传到Launchpad。 - rubo77
而且在 -k'YOUR GPG KEY' 中没有空间。 - Anwar
你救了我的一天 - iWizard
1在Ubuntu 14.04上,debuild失败并显示以下错误信息:dpkg-buildpackage: error: fakeroot debian/rules binary gave error exit status 2 - Luís de Sousa
如果安装过程还需要创建一个用户(例如tomcat包中的tomcat7),这是否需要手动使用手写脚本来完成,这些脚本是软件包的一部分?用户创建脚本将如何运行以及何时运行,安装过程如何切换到该用户? - John Little
4dh_make: error: argument -i/--indep: not allowed with argument -s/--single - Jeff Puckett