本文介绍deb打包的方法,提前是用linuxdeployqt 工具拷贝好应用的依赖文件,具体可以参考我上一篇博客

利用linuxdeplouqt进程程序打包:

一、deb包安装路径原理简述

下面举个例子进行说明,我们先来看打包目录与安装后目录结构对比。打包目录,DEBIAN下面为deb包控制文件,应用与依赖文件位于source/opt/Test/,如下:

source
├── DEBIAN
│   └── control
│   └── postinst
│   └── postrm
├── opt
    └── Test
        ├── Test
        └── xxx

若按照此打包目录生成deb,安装后,其目录如下:

/
├── opt
    └── Test
        ├── Test
        └── xxx

小结

DEBIAN目录下主要存放一些控制文件和脚本,具体后面使用到时,再细说。DEBIAN目录固定放置于打包目录顶层。deb包安装时,默认将内部文件,释放至根目录下(/),故我们需要在打包时,将安装目录层次创建好,以达到想要的安装路径效果。

二、规划安装路径

比如我希望将bianyin 应用安装到/opt/bianyinstation下,下面开始创建目录层次:

  1. /data/下创建app目录,用于程序打包;
  2. 在 /data/app/创建output目录,用于存放生成的deb包;
  3. 在 /data/app/创建source目录,在source目录下创建DEBIAN目录;
  4. 软件包架构 软件包架构不匹配uos_软件包架构

  5. 创建安装路径层次opt目录,以及opt/bianyinstation目录;
  6. 然后将你要应用程序的依赖文件,全部拷贝到source/opt/bianyinstation/目录下;
  7. 软件包架构 软件包架构不匹配uos_desktop_02

三、配置*.desktop桌面快捷方式

用终端打开,你可以看到后缀为*.desktop 问文件,你把他拷贝搭配桌面,你会发现他会变成一个带图标的快捷方式。

软件包架构 软件包架构不匹配uos_qt_03

接下来,我们修改desktop的内容:

它有如下内容需要编辑:

[Desktop Entry]
Type=Application
Name=My Test                    #应用的名字(快捷方式显示的文字)
Exec=/opt/Test/Test             #应用的执行路径(绝对路径)
Icon=/opt/Test/Test.png         #应用的图标(绝对路径)
Comment=This is my test         #说明信息
Terminal=true                   #是否允许在终端启动

注意:

Test.desktop文件需要有执行权限,该文件才能变成图标,否则只是显示一个普通文件。Test.desktop中的路径需要填写deb包的安装路径,非打包路径。Terminal=true时,启动程序时,会附带启动终端界面,即会出现2个界面。Terminal=false时,启动程序时,没有终端界面,仅显示程序这一个界面。

软件包架构 软件包架构不匹配uos_软件包架构_04

四、创建deb包只control文件

control文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。

我们在DEBIAN目录下创建名为control的文件,内容如下:

Package: BianyinStation
Version: 3.2.0.0005
Section: utils
Priority: optional
Architecture: arm64
Depends:
Installed-Size: 512
Maintainer:123@163.com
Description: 辨音™音频综合应用工作站

字段含义:

Package:包名。记住,后面卸载时候需要包名。Version:应用版本。Architecture:架构,我这里是amd64。Maintainer:维护人员联系方式,看着办。Description:软件包描述。其他的,这里没用到,就不写了,自己百度吧。

五、创建deb之postinst文件

负责安装完成时的配置工作,软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。

我们在DEBIAN目录下创建名为postinst的文件,内容如下:

#!/bin/sh
chmod 777 /opt/bianyinstation/bianyin.desktop
cp /opt/bianyinstation/bianyin.desktop /usr/share/applications/
#cp /opt/bianyinstation/bianyin.desktop ~/Desktop/

主要将bianyin.desktop拷贝至2个目录,Desktop目录下,自动生成桌面快捷方式。applications目录下,生成开始菜单中,other菜单下子项。

六、创建deb包只postrm文件

软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行。我们在DEBIAN目录下创建名为postrm的文件,内容如下:

#!/bin/sh
if [ -f "/usr/share/applications/bianyin.desktop"]; then
    rm /usr/share/applications/bianyin.desktop
fi

if [ -f "~/Desktop/bianyin.desktop"]; then
    rm ~/Desktop/bianyin.desktop
fi

这里我增加了条件判断,开始我没写条件判断时,出现卸载失败,原因是找不到卸载的文件;

七、使用dpkg命令构建deb包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffjXH2up-1673941724962)(en-resource://database/2310:0)]

八、deb安装与卸载

1、命令安装:

sudo dpkg -i xxxxxx.deb

2、双击安装包界面安装:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNvNRGpe-1673941724962)(en-resource://database/2308:0)]

完成后效果如下:

软件包架构 软件包架构不匹配uos_debian_05

九、问题

1、安装时报架构不匹配:
检查control文件填写的架构与你本机的架构是否匹配;
2、安装时报错:
查看错误具体分析:

可能问题:postinst 、postrm 这两个脚本有语法错误,执行脚本时报错,打包钱可以先执行一下这两个脚本,看是否执行成功

好啦,Qt程序在uos平台实现界面化安装就实现啦!