1、前言
上个月硬盘坏了,以前那个作者打包的deb包丢了,只留下一个github源码,接着当然是好好学习怎么打包,这也是一个打包教程。
要打包得回答两个问题,用什么软件打包
还有就是得准备是什么
?
1.1、用什么软件打包
找了下在官网找到点文档
,Chapter 7 - Basics of the Debian package management system,7.15 How do I create Debian packages myself?
- Debian New Maintainers’ Guide的PDF文档,找到打包的基础工具包
- Guide for Debian Maintainers的PDF文档,找到生成打包所需文件的文档的软件。
1.2、打包需要准备什么文件?
- 软件的图标文件.desktop文件
- deb软件格式的构建文档dedian文件夹,里面包含deb构建信息,其中control文件是核心
2、系统环境及需求
- 系统:deepin 15.8
- qtmake版本:qt5-qmake
- 需打包软件github:https://github.com/rekols/monitor-desktop
3、构建过程
这里快速过一下过程。
3.1、安装打包软件
root环境下执行
apt-get install build-essential
apt-get install debmake
build-essentials:文档说明这个软件是必须的
debmake:生成必要的打包文件
3.2、下载源码包
下载软件包,并删除debian文件夹,因为要走一次过程。
git clone https://github.com/rekols/monitor-desktop
接着删掉debian文件夹
3.3、准备软件包必要文件
3.3.1、desktop内容
这里贴一下desktop内容,过一下:
[Desktop Entry]
Categories=Application;Utility;
Encoding=UTF-8
Exec=/usr/bin/rekols-monitor
Icon=apps.com.onlinego
Name=Rekols Monitor
Name[zh_CN]=系统监视悬浮窗
Name[zh_TW]=系统监视悬浮窗
StartupNotify=false
Terminal=false
Type=Application
X-MultipleArgs=false
3.3.2、生成debian文件夹配置文件
debian文件夹比较复杂,这里只能用命令生成,在源码目录下执行
(普通用户即可):
debmake -e rekols@foxmail.com -p rekols-monitor -u 0.1 -f "rekols" -m -n -x1
解释一下参数:
-e:邮件地址
-p:软件包名
-u:软件版本号
-f:作者全名"firstname lastname"
-m:force packages to be non-multiarch,这个选项看每个人的情况吧,我个人建议是多一个功能有何不好,这里只是演示有这个参数
-n
:make a native source package without .orig.tar.gz ,这个参数是核心
,直接从源码生成配置文件,而不是从xxx.orig.tar.gz生成。前面参数单独使用都会提示需要设置参数,跟生成参数一起,才不会提示
-x1:这个参数的默认值就是x1,这里是说明这个参数的作用,deb包的构建过程有很多钩子方法,x1只是包含一些项目信息和构建信息的版本,x0就只有构建信息,但是x0参数已经被弃用
,x2、x3、x4你会发现生成文件很多,一般没有特殊情况,最简即可,即使用默认参数x1即可
Note:如果源码不是c类型的,是java、python等,你可能需要使用debmake -b
选项,这里我也没试过,但是其他语言是要更改的
参数修改
的模板内容,`-xxxx`为参数:
Source: `-p`
Section: unknown
Priority: extra
Maintainer: `-f` `-e`
Build-Depends: debhelper (>=9), qt4-qmake
Standards-Version: 3.9.8
Homepage: 自己的项目主页
Package: `-p`或者`-b`覆盖
Architecture: any
Multi-Arch: foreign 使用`-m`这一行会不设置
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: 自己写的软件描述
3.3.3、修改配置文件
接着修改debian/control的内容。下面三项默认内容需要修改:
Section: unknown
Priority: extra
Build-Depends: debhelper (>=9), qt4-qmake
改成:
Section: base
Priority: optional
Build-Depends: debhelper (>=9), qt5-qmake
- Priority的默认生成为extra,extra在新版deb包中已经
弃用
,官方推荐使用optional,其中如果用了默认的extra,会出现卸载不了,需要在root权限下才能使用dpkg -i命令卸载,使用optional能正常卸载,所以不更改的话,会出现权限问题,权限不在本用户,而在root用户。 - Build-Depends的qt4-qmake改为qt5-qmake,同时命令行执行
apt-get install qt5-default
命令,安装qt5-qmake,这里只要你安装了qt4-qmake,不用修改也是可以的,qmake是编译源码用的,但是最好还是跟源码版本相同好 - Section不知道怎么填,官方文档看不到这个base的选项,controlfields.html的5.6.5. Section的2.4. Sections
不用修改的选项Homepage和Description为描述性属性,按自己喜好修改即可。
3.4、生成deb包
在源码目录下执行
(得在root用户下执行,不然权限不够)
dpkg-buildpackage -us -uc -tc -b
或者
debuild -uc -us -tc -b
debuild是对dpkg-buildpackage进一步封装。所以dpkg-buildpackage的参数在debuild都能用
参数解释:
-uc:unsigned .buildinfo and .changes file.
-us:unsigned source package.
-tc:clean source tree when finished. 清理qmake生成的中间文件,让源码变回只有源码文件
-b
:binary-only, no source files. //只需要源码就可以打包出deb包,其他参数的话,要压缩包,这里用不到,因为本来只有源码,这个-b参数可以省略,多生成两个文件,自己探索吧
最后输出的文件:
个人使用的东西,不需要签名,没有签名文件会跳过,而且我也不知道怎么搞,这才是关键,自用,这就不管了。至此打包结束。
文档是这样的:
虽然在源码路径下执行打包命令,但是debmake命令生成的文件是这个路径的父路径。
4、配置文件知识
4.1、debian配置文件
在程序源代码目录下有一个叫做 debian 的新的子目录。这个目录中存放着许多文件,我们将要修改这些文件来定制软件包行为。其中最重要的文件当属 control, changelog, copyright, 以及 rules, 所有的软件包都必须有这几个文件。
其实copyright文件不是必须的,因为少了还能构建,必须的文件: control、changelog、rules、compat
debian文件夹目录结构:
自动生成的文件中,必须保证control、changelog、rules、compat文件存在,不然报错。其余文件斟酌要不要删了
Note:其中生成命令中如果不使用-p指定软件包名和-u指定软件版本,将自动用文件夹格式生成软件名和版本,格式:软件名-版本
,这里不设置,默认为软件名:monitor、版本:desktop,版本号不是数字;打deb包时,changelog的讲报错,因为抬头格式不正确,需要手动修改为正确的版本号,或者你的文件夹名起名规范。
这里不出情况,只需要关注control下即可。
4.2、debian/control配置文件
debmake -n
命令生成的control:
Source: monitor
Section: unknown
Priority: extra
Maintainer: <hui@localhost>
Build-Depends: debhelper (>=9), qt4-qmake
Standards-Version: 3.9.8
Homepage: <insert the upstream URL, if relevant>
Package: monitor
Architecture: any
Multi-Arch: foreign
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: auto-generated package by debmake
This Debian binary package was auto-generated by the
debmake(1) command provided by the debmake package.
参数解释:
参数 | 解释 |
---|---|
Source | This field identifies the source package name,不知道用来干嘛的,但是改了这需要同时修改changelog的生命包名 |
Section | This field specifies an application area into which the package has been classified,暂时不知道填什么,可能填这个也可能不是–session-sid,暂时只知道一个选项是base |
Priority | This field represents how important it is that the user have the package installed,这个属性有required、important、standard、optional、extra(已弃用)五个选项,其中官方推荐是optional,但是根据实际情况选择吧。 |
Maintainer | 维护者信息或者说是作者信息 |
Build-Depends | 构建的依赖,列出来的依赖,需要系统安装了才能制作deb包成功 |
Standards-Version | The most recent version of the standards (the policy manual and associated texts) with which the package complies,不清楚怎么给出来的。 |
Homepage | 主页地址,描述性信息 |
Package | The name of the binary package,最后生成的软件名,安装后dpkg -l 显示的名字,卸载也用这个名字 |
Architecture | 软件的架构,可以用dpkg-architecture -L中列出的字符串,最多人用的是all 或者any |
Multi-Arch | 具体参看man debmake 的-b参数,自动设置。或者-b设置特定类型的应用自动设置,如果不是像这个例子一样是c++的,可能需要设置一下debmake -b 设置具体的程序类型,令Architecture和Multi-Arch自动更改。 |
Depends | 默认即可,要知道详细可到4.1章节处了解 |
Description | 软件描述,dpkg安装时显示。 |
权威解释请看:https://www.debian.org/doc/manuals/maint-guide/dreq.zh-cn.html#control的4.1章节。
和https://www.debian.org/doc/debian-policy/ch-controlfields.html#source-package-control-files-debian-control
4.3、desktop配置文件
.desktop文件是桌面版本的软件的快捷方式描述文件。
只是普通文本文件,找个模板修改即可,之后看看有没空,找找生成工具什么的。
[Desktop Entry]
Categories=Application;Utility;
Encoding=UTF-8
Exec=/usr/bin/rekols-monitor
Icon=apps.com.onlinego
Name=Rekols Monitor
Name[zh_CN]=系统监视悬浮窗
Name[zh_TW]=系统监视悬浮窗
StartupNotify=false
Terminal=false
Type=Application
X-MultipleArgs=false
关键字 | 意义 |
---|---|
[Desktop Entry] | 文件声明行 |
Categories | 应用的类型(内容相关) |
Encoding | 编码 |
Exec | 执行的命令 |
Icon | 图标路径 |
Name | 应用名称 |
Name[xx] | 不同语言的应用名称,这里配置了两个语言 |
StartupNotify | 是否能使用提示反馈,默认值为false |
Terminal | 是否使用终端 |
Type | 启动器类型 |
X-MultipleArgs | 是否有多个参数 |
参数参考: