将二进制可执行程序构建为deb包

构建deb包所需依赖:
apt install dh-make

本文使用本站aptdownloader包做为演示

第一步,创建项目目录,项目目录名称格式应为包名-版本号aptdownloader-1.0.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# 我在我的/root/目录下创建了一个deb文件夹,也就是https://github.com/1949hacker/deb的仓库
# 使用tree列出目录结构并指定只显示3层
tree -L 3
# 目录结构如下
deb
├── LICENSE # 这个就不用解释了,git仓库的许可
├── package # 这个是我用来存构建deb的文件的文件夹
│   └── aptdownloader # aptdownloader包
│   ├── aptdownloader-1.0.0 # 按照包名-版本规则创建的文件夹
│   ├── aptdownloader_1.0.0-1_amd64.buildinfo # dpkg-buildpackage -us -uc -nc生成的文件
│   ├── aptdownloader_1.0.0-1_amd64.changes # dpkg-buildpackage -us -uc -nc生成的文件
│   ├── aptdownloader_1.0.0-1_amd64.deb # dpkg-buildpackage -us -uc -nc生成的deb包
│   └── aptdownloader_1.0.0.orig.tar.xz # dpkg-buildpackage -us -uc -nc生成的文件
├── python-source # 这个是我用来存放python源码的目录
│   ├── 64pxlogo.ico # logo的ico
│   ├── aptdownloader # aptdownloader的源码文件夹
│   │   └── aptdownloader.py # aptdownloader的源码
│   ├── dist # pyinstaller生成的可运行的二进制文件
│   │   └── aptdownloader # 二进制文件
│   └── pip # python venv的文件夹
│   ├── bin
│   ├── include
│   ├── lib
│   ├── lib64 -> lib
│   └── pyvenv.cfg
├── README_en.md # 自述文件英文版
└── README.md # 自述文件中文版

# 首先,进入python-source目录,使用以下命令激活python虚拟环境
# source后面的路径以你的python venv地址为准,your_path/bin/active
source pip/bin/activate
# 使用pyinstaller命令将aptdownloader.py转换为二进制可执行程序
# -i是指定图标,我linux都是用命令行,没试过图形化里会不会显示图标
# -F是生成单文件,后面紧跟着的就是源代码
# --distpath bin表示将生成的可执行程序输出到当前目录的bin文件夹中
# --workpath temp_build和--specpath temp_spec都是指定一个临时构建目录temp_build和一个临时spec配置文件目录temp_spec
# 使用&&链接符确保执行成功后分别rm删除两个临时目录
pyinstaller -F aptdownloader/aptdownloader.py -i 64pxlogo.ico --distpath bin --workpath temp_build --specpath temp_spec && rm temp_build -rf && rm temp_spec -rf

# 最终会将生成的程序输出到当前目录的bin文件夹
deb/python-source
├── 64pxlogo.ico # 本就存在的图标文件
├── aptdownloader # 本就存在的源码文件夹
│   └── aptdownloader.py # python源码
├── bin # 存放可执行程序的目录
│   └── aptdownloader # 生成的可执行程序
└── pip # 我创建的python venv环境目录

# 返回最外层目录,我的是deb目录且位于用户主目录,然后进入package目录
cd ~/deb
cd package
# 新建aptdownloader目录并进入
mkdir aptdownloader && cd aptdownloader

# 按照包名+版本的规则创建目录
mkdir aptdownloader-1.0.0
# 进入并使用dh_make创建项目文件
cd aptdownloader-1.0.0
dh_make --createorig
# 输入该命令后终端显示内容如下
(pip) root@vladimir:~/deb/package/aptdownloader/aptdownloader-1.0.0# dh_make --createorig
/usr/bin/dh_make:10: DeprecationWarning: 'nis' is deprecated and slated for removal in Python 3.13
import nis
Type of package: (single, indep, library, python)
[s/i/l/p]? # 我要生成的是单包,所以这一步我按的是s键,按键就行,不需要Enter
Maintainer Name : root
Email-Address : root@localhost.localdomain
Date : Fri, 21 Jun 2024 16:47:31 +0800
Package Name : aptdownloader
Version : 1.0.0
License : blank
Package Type : single
Are the details correct? [Y/n/q] # 这一步按Y确认
Currently there is not top level Makefile. This may require additional tuning
Done. Please edit the files in the debian/ subdirectory now.

# 现在当前目录便生成了debian文件夹
# 编辑debian/control文件,以你的为准,我的源内容如下,参照我给的注释修改即可
Source: aptdownloader # 来源,这个是默认生成的,不管
Section: unknown # 默认是unknown,我改成了utils(工具)
Priority: optional # 默认不用改
Maintainer: root <root@localhost.localdomain> # 这一步改成你的信息,参考下方我的control文件内容
Rules-Requires-Root: no # 默认不用改
Build-Depends: # 默认不用改
debhelper-compat (= 13), # 默认不用改
Standards-Version: 4.6.2 # 默认不用改
Homepage: <insert the upstream URL, if relevant> # 改成你的官网,没有就不管
#Vcs-Browser: https://salsa.debian.org/debian/aptdownloader # 默认不用改
#Vcs-Git: https://salsa.debian.org/debian/aptdownloader.git # 默认不用改

Package: aptdownloader # 根据你的文件夹生成,默认不用改
Architecture: any # 默认不用改
Depends: # 默认不用改
${shlibs:Depends}, # 默认不用改
${misc:Depends}, # 默认不用改,需要前置依赖就换行写你的依赖,参考我的control文件
Description: <insert up to 60 chars description> # 60字简短描述
<Insert long description, indented with spaces.> # 换行后再写详细描述

# 以下是我的deb/control文件内容
Source: aptdownloader
Section: utils
Priority: optional
Maintainer: Vladimir Yang <0@hackerbs.com>
Rules-Requires-Root: no
Build-Depends:
debhelper-compat (= 13),
Standards-Version: 4.6.2
Homepage: https://hackerbs.com
#Vcs-Browser: https://salsa.debian.org/debian/aptdownloader
#Vcs-Git: https://salsa.debian.org/debian/aptdownloader.git

Package: aptdownloader
Architecture: any
Depends:
${shlibs:Depends},
${misc:Depends},
apt-rdepends (>= 1.0) # 我的前置需要该包,所以要这样写
Description: A tool for downloading apt packages and their dependencies.
Use 'aptdownloader <package name>' to download the software package and its dependencies to the current directory.
example:
aptdownloader docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 编辑debian/install文件(需新建),告诉dpkg我的aptdownloader可执行程序应该放到/usr/bin下
# 格式为:包名 安装目录
# 我的install内容:
aptdownloader usr/bin

# 回到aptdownloader-1.0.0目录
cd /root/deb/package/aptdownloader/aptdownloader-1.
0.0/
# 将我的可执行程序aptdownloader放到该目录
cp ../../../python-source/bin/aptdownloader ./
# 现在便可执行最后一步,运行dpkg-buildpackage
dpkg-buildpackage -us -uc -nc
# 然后退回到上层aptdownloader目录,即可看到
/root/deb/package/aptdownloader
├── aptdownloader-1.0.0 # 项目版本目录
├── aptdownloader_1.0.0-1_amd64.buildinfo # dpkg-buildpackage生成的构建信息
├── aptdownloader_1.0.0-1_amd64.changes # dpkg-buildpackage生成的变更信息
├── aptdownloader_1.0.0-1_amd64.deb # dpkg-buildpackage构建好的deb包
└── aptdownloader_1.0.0.orig.tar.xz # dpkg-buildpackage生成的其他文件的归档

至此,构建deb包的教程结束,请移步[如何搭建具有GPGkey验证的可信任apt源]