最简单的Debian打包指南是什么?

我去了Ubuntu的维基页面,但是感到困惑,因为有太多种方法。请告诉我一个简单的Debian打包指南。

4你想为自己使用、在特定的电脑上创建软件包,还是为他人使用? - andol
2你想打包的软件是哪种语言? - Umang
8我有同样的问题。大多数教程和指南都以“获取上游tarball”开始。从这一点开始,我们就迷失了方向。我们只想部署一个简单的东西,没有上游tarball,也没有源代码。只是一个war文件、一些脚本和一些jar文件。上游tarball到底是什么意思?有没有人看过一个不使用上游tarball的综合指南(例如处理用户问题)? - John Little
3我会选择我在StackOverflow上发布的那个答案。 - user438925
如果你想创建“虚拟包”(将依赖项分组),不妨看一下 equivs-build - Rolf
7个回答

这是一个创建基本.deb文件的好方法。它适用于个人使用,但如果您希望将软件包包含在Debian / Ubuntu中,这个方法就不够严格了-对此,您应该阅读Debian新维护者指南和/或Ubuntu打包指南(我相信您已经尝试过)。
检查您的.deb文件是否符合规范的好工具是lintian(可从存储库安装)。
在Ask Ubuntu聊天室中有两个会话。 Ubuntu上的打包基础知识(打包:第1部分) 为Launchpad PPAs打包Ubuntu软件(打包:第2部分)

1这个很好地总结了开始打包所需的内容,但是在HOWTO中我错过了将应用程序图标包含在deb文件中的信息(在其他地方也没有找到相关内容)。有关如何做到这一点的任何提示吗? - nightcod3r

你有哪些部分遇到困难?虽然复杂,但是当我按照指南操作时,它似乎很清晰。
快速总结:
- 解压源代码 `.tar.gz` 文件 - 运行 `dh_make` - 编辑 Debian 文件 - 运行 debuild

3让我困惑的是,无论源语言还是目录结构,这个过程都是一样的吗? - Seth
17关键是,我们没有.tar.gz文件。我们想打包我们编写的应用程序。似乎没有任何指南涵盖这一点,它们都从一个"上游tarball"开始,而我们没有这个。 - John Little
@JohnLittle 这个答案可能会有所帮助:http://askubuntu.com/a/27731/5 - Nathan Osman
1长期、重复的包装怎么样?我每次都要做这样复杂而冗长的包装流程吗? - kravemir
如果用户没有GPG密钥,debuild将会失败并显示"debsign: gpg error occurred! Aborting...."。 - agc

您甚至可以使用dpkg-deb来创建简单的软件包。
这里有一个来自Ubuntuforums的不错教程。

这篇指南最初发布在StackOverFlow上,适用于预编译或解释型软件:

构建deb包的正确方法是使用dpkg-buildpackage,但有时候会有些复杂。相反,您可以使用dpkg -b <folder>来创建您的Debian包。

以下是使用dpkg -b <folder>创建Debian包的基本步骤,适用于任何二进制文件或自动运行的脚本(如Python、Bash、Pearl、Ruby)而无需手动编译:

  1. 创建文件和文件夹以便重新创建以下结构:

    ProgramName-Version/
    ProgramName-Version/DEBIAN
    ProgramName-Version/DEBIAN/control
    ProgramName-Version/usr/
    ProgramName-Version/usr/bin/
    ProgramName-Version/usr/bin/your_script
    

    位于 /usr/bin/ 的脚本可以直接从终端调用,注意我没有给脚本添加扩展名。同时你可以注意到,deb 包的结构将成为程序安装后的结构。所以如果你的程序只有一个文件,你可以直接将其放在 ProgramName-Version/usr/bin/your_script 下,但如果你有多个文件,你应该将它们放在 ProgramName-Version/usr/share/ProgramName/all your files 下,并且只在 /usr/bin/ 下放置一个文件,该文件将从 /usr/share/ProgramName/ 调用你的脚本。

  2. 将所有文件夹权限更改为 root:

    chown root:root -R /path/to/ProgramName-Version  
    
  3. 更改脚本的权限:

    chmod 0755 /path/to/the/script
    
  4. 最后,你可以运行:dpkg -b /path/to/the/ProgramName-Version,你的 deb 包将被创建!(你还可以添加后/前安装脚本和任何你想要的东西,它的工作方式与普通的 Debian 包相同)

这是一个control文件的示例。您只需要将其复制/粘贴到一个名为"control"的空文件中,并将其放在DEBIAN文件夹中。
Package: ProgramName
Version: VERSION
Architecture: all
Maintainer: YOUR NAME <EMAIL>
Depends: python2.7, etc , etc,
Installed-Size: in_kb
Homepage: http://foo.com
Description: Here you can put a one line description.This is the short Description.
 Here you put the long description, indented by 1 space.


4checkinstall 提供了一种快速的方式,从源代码安装方法构建 debin 二进制包(.deb)。然而,它并没有提供一个正确的 Debian 包(从 Debian 源代码包构建)。 - João Pinto
哦,天啊..在编译之前我得用那个..那就像是几个小时的编译时间。 - Piotr Kula

不,这个世界上最简单和最清晰的包装指南是
在Ubuntu和其他Debian系统上打包Java应用程序
几天前,为了我的第一个应用程序,我按照这个教程创建了DEB包。非常清晰,我的应用程序成功地被打包了。是的,至少对我来说这是最简单的。
你可以将它与Debian包装指南进行比较。

3"简单"不代表"完整"。一个基本的.deb打包教程无法涵盖各种类型的程序所需要的许多策略,因此打包并不像只是一个"简单教程"那样容易。 - Thomas Ward
绝对简单。它让我入门,并且在几分钟内就能创建我的第一个Debian软件包。虽然还有很多细节要处理(来自lintian的糟糕软件包质量消息),但这是一个很好的起点。 - atmelino

根据接受的答案,我制作了一个Python脚本,可以按照这个教程创建一个helloworld_1.0-1.deb软件包。你可以根据自己的需求进行修改。
复制该脚本并使用Python 3运行: python3 create_debian_package.py
#!/usr/bin/env python3
"""
This script is going to create a debian package
"""
import os

print('This script is going to create a debian package')

###### EDIT THIS SECTION WITH YOUR PACKAGE INFORMATION ######
include_hello_world_script = True # Set to False to manually copy your files and remove helloworld program
package_name = 'helloworld'
major_version = 1
minor_version = 0
package_revision = 1
section = 'base'
priority = ''
architecture = 'i386' #Change to armhf for Raspberry Pi
depends = '' #For example: libsomethingorrather (>= 1.2.13), anotherDependency (>= 1.2.6)
maintainer = 'Your Name <you@email.com>'
#The space before each line in the description is important
package_description = """Hello World
 When you need some sunshine, just run this
 small program!
"""
###### NO EDITING NEEDED BEYOND THIS LINE ######

version_name = str(major_version) + '.' + str(minor_version) + '-' + str(package_revision)
full_package_name = package_name + '_' + version_name
path = os.getcwd()
package_folder = os.path.join(path, full_package_name)
os.makedirs(package_folder, exist_ok=True)
os.makedirs(os.path.join(package_folder, 'DEBIAN'), exist_ok=True)
with open(os.path.join(package_folder, 'DEBIAN', 'control'), 'w') as file:
    file.write("""Package: """ + package_name + """
Version: """ + version_name + """
Section: """ + section + """
Priority: """ + priority + """
Architecture: """ + architecture + """
Depends: """ + depends + """
Maintainer: """ + maintainer + """
Description: """ + package_description)

if include_hello_world_script:
    script_destination = os.path.join(package_folder, 'usr/local/bin')
    os.makedirs(script_destination, exist_ok=True)
    helloworld_filename = os.path.join(script_destination, 'helloworld')
    with open(helloworld_filename, 'w') as file:
        file.write("""#!/usr/bin/env python3
print('Hello World!')""")
    os.chmod(helloworld_filename, 0o755)

input("Put your files in the package structure and press Enter to continue...")
os.system('dpkg-deb --build ' + full_package_name)