当前位置: 首页 > news >正文

【国产桌面操作系统】QT应用打deb包

前言

        本文所指的国产桌面操作系统是统信UOS和麒麟kylin系统,deb包在这两个环境中都可以直接安装。

一图读懂国产操作系统历史

不管是统信UOS还是麒麟kylin,都有Debian深厚的历史,都支持dpkg打包。

需要注意的是,麒麟kylin系统还能沿用Ubuntu仓库的东西,而统信UOS的前身deepin有一段时间作为Ubuntu分支发布,但在发布理念上有冲突就挂到debian分支,后因国产化需要,脱离debian独立发行,改名为统信UOS。

dpkg打包deb

以下通过QT项目来实现自动化打包,在介绍完关键点之后会提供一个完整的打包脚本。

QT项目打生产环境包

QT项目是需要经过linuxdeployqt打包之后,才具备在生产环境运行的能力。历史博文中有分享

https://blog.csdn.net/liangyuna8787/article/details/144162349?spm=1001.2014.3001.5502https://blog.csdn.net/liangyuna8787/article/details/144162349?spm=1001.2014.3001.5502

打包的目录结果图

├── DEBIAN/
│   ├──control  #deb包的核心配置文件
│   ├──postinst #deb包安装好后执行的脚本
│   └──prerm    #deb包卸载前执行的脚本
└── opt/
     └── apps/
        └── cn.uos.appname/
            ├── entries/
            │   ├── applications/
            │   │         └── myapp.desktop    #桌面文件
            │   └── icons/
            │               └── myapp.png        #图片文件
            └── files/
                ├── bin/
                          └── myapp            #应用文件

文件路径

用途说明

内容示例/要求

DEBIAN/control

包的基本元数据信息

包含包名、版本、描述、依赖等

DEBIAN/postinst

安装后配置脚本

桌面菜单注册、权限设置等

DEBIAN/prerm

卸载前清理脚本

桌面菜单注销、服务停止等

entries/applications/myapp.desktop

桌面启动器文件

定义应用在启动器中的显示

entries/icons/myapp.png

应用图标文件

应用在启动器和桌面显示的图标

files/bin/myapp

主程序文件

应用的可执行二进制文件

以上结构是必要的,还可以扩展,本篇不进行扩展,以下是关键点的说明

核心配置文件control

  • Package:包的名称
  • Version:版本
  • Architecture:架构
  • Depends:依赖性
Package: cn.uos.appname
Version: 1.0.0-1
Architecture: amd64
Maintainer: Your Name <email@example.com>
Description: My ApplicationA wonderful application for UOS system.This is a detailed description of the application.
Depends: libc6 (>= 2.14), libqt5core5a
Section: utils
Priority: optional

安装好后执行的脚本postinst

应用安装至少把目录拷贝到指定目录就完了。如果需要进行桌面的启动文件拷贝、给权限等操作,都在此脚本中进行。

卸载软件之前执行prerm

比如删除桌面启动器、关闭应用的服务等操作,如果没有就不处理。

应用程序安装的目录

统信UOS商店下载的应用默认都是安装在/opt/apps/目录下,结构图中已经有这个路径了,安装时是整个目录拷贝过去的。

以下是自动打包脚本:

#!/bin/bash
#uos_deb_pkg.sh
#统信UOS QT项目打包脚本
#目录层级如下:
#myapp/
#├── DEBIAN/
#│   ├──control  #deb包的核心配置文件
#│   ├──postinst #deb包安装好后执行的脚本
#│   └──prerm    #deb包卸载前执行的脚本
#└── opt/
#    └── apps/
#        └── cn.uos.appname/
#            ├── entries/
#            │   ├── applications/
#            │   │   └── myapp.desktop	#桌面文件
#            │   └── icons/
#            │       └── myapp.png		#图片文件
#            └── files/
#                ├── bin/
#                │   └── myapp			#应用文件
#                └── lib/
#                    └── *.so
#配置参数
APP_NAME="myapp"
PACKAGE_NAME="cn.uos.${APP_NAME}"
VERSION="1.0.0"
ARCHITECTURE="amd64"
MAINTAINER="ok@myapp.com"
DESCRIPTION="基于QT开发的应用程序"#检查myapp目录是否存在---放在与当前脚本同一级目录下
if [ ! -d "${APP_NAME}" ]; thenecho "错误: 未找到${APP_NAME}目录,请确保linuxdeployqt已成功生成该目录"exit 1
fi#创建打包工作目录
WORK_DIR="${PACKAGE_NAME}_${VERSION}"
mkdir -p "${WORK_DIR}/DEBIAN"
mkdir -p "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/files"
mkdir -p "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/entries/applications"
mkdir -p "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/entries/icons"echo "开始打包流程..."#复制应用程序文件--整理目录一起复制
echo "复制应用程序文件..."
cp -r "${APP_NAME}/"* "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/files/"#查找并处理可执行文件
EXECUTABLE=$(find "${APP_NAME}" -type f -executable | head -n1)
if [ -n "$EXECUTABLE" ]; thenEXECUTABLE_NAME=$(basename "$EXECUTABLE")
else#如果找不到可执行文件,尝试查找常见的可执行文件EXECUTABLE_NAME="${APP_NAME}"#确保文件有执行权限chmod +x "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/files/${EXECUTABLE_NAME}" 2>/dev/null || true
fi#创建桌面文件
cat > "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/entries/applications/${PACKAGE_NAME}.desktop" << EOF
[Desktop Entry]
Version=1.0
Type=Application
Name=${APP_NAME}
Comment=${DESCRIPTION}
Exec=/opt/apps/${PACKAGE_NAME}/files/${EXECUTABLE_NAME}
Icon=/opt/apps/${PACKAGE_NAME}/entries/icons/${APP_NAME}.png
Terminal=false
Categories=Utility;
EOF#查找并复制图标文件
ICON_FILES=$(find "${APP_NAME}" -name "*.png" -o -name "*.svg" | head -n1)
if [ -n "$ICON_FILES" ]; thencp "$ICON_FILES" "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/entries/icons/${APP_NAME}.png" 2>/dev/null || true
fi
#创建DEBIAN/control文件
cat > "${WORK_DIR}/DEBIAN/control" << EOF
Package: ${PACKAGE_NAME}
Version: ${VERSION}
Section: utils
Priority: optional
Architecture: ${ARCHITECTURE}
Depends: libc6 (>= 2.14), libqt5core5a
Installed-Size: 102400
Maintainer: ${MAINTAINER}
Description: ${DESCRIPTION}
EOF# 创建postinst脚本(安装后执行)
cat > "${WORK_DIR}/DEBIAN/postinst" << EOF
#!/bin/bash
# 更新桌面数据库
update-desktop-database /usr/share/applications
# 为所有普通用户创建桌面快捷方式
for USER_DIR in /home/*; doif [ -d "\${USER_DIR}" ] && [ -d "\${USER_DIR}/Desktop" ]; thenUSER_NAME=\$(basename "\${USER_DIR}")# 拷贝桌面文件到每个用户的桌面cp "/opt/apps/${PACKAGE_NAME}/entries/applications/${PACKAGE_NAME}.desktop" "\${USER_DIR}/Desktop/${PACKAGE_NAME}.desktop" 2>/dev/null || true# 设置所有者和权限chown "\${USER_NAME}:\${USER_NAME}" "\${USER_DIR}/Desktop/${PACKAGE_NAME}.desktop" 2>/dev/null || truechmod +x "\${USER_DIR}/Desktop/${PACKAGE_NAME}.desktop" 2>/dev/null || truefi
done
EOF# 创建prerm脚本(卸载前执行)
rm -rf "\${USER_DIR}/Desktop/${PACKAGE_NAME}.desktop" 2>/dev/null
#!/bin/bash
EOF# 设置脚本权限
chmod 755 "${WORK_DIR}/DEBIAN/postinst"
chmod 755 "${WORK_DIR}/DEBIAN/prerm"# 设置文件权限
find "${WORK_DIR}" -type f -name "*.desktop" -exec chmod 755 {} \;
find "${WORK_DIR}/opt/apps/${PACKAGE_NAME}/files" -type f -executable -exec chmod +x {} \;# 计算安装大小
INSTALLED_SIZE=$(du -sk "${WORK_DIR}/opt" | cut -f1)
sed -i "s/Installed-Size: 102400/Installed-Size: ${INSTALLED_SIZE}/" "${WORK_DIR}/DEBIAN/control"# 打包生成.deb文件
DEB_FILE="${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
echo "正在生成deb包: ${DEB_FILE}"
dpkg-deb -b "${WORK_DIR}" "${DEB_FILE}"# 清理工作目录
rm -rf "${WORK_DIR}"echo "打包完成!"
echo "生成的deb文件: ${DEB_FILE}"
echo "可以使用以下命令安装: sudo dpkg -i ${DEB_FILE}"

以上脚本uos_deb_pkg.sh需要手动修改#配置参数#,以及control、postinst和prerm中的内容,然后把QT项目打包好的目录放在同一个目录下后,在终端执行命令:

sh uos_deb_pkg.sh

这样就是打好包了,此是在同级目录下即可看到一个打包好的deb包

工具打包deb

以上dpkg打包过程并不复杂,也是有人制作了一个打包工具,在统信UOS的商店中可以下载,关键词搜:UOS打包工具

这里有工具使用介绍,结合我分享的dpkg打包deb过程,相似度是非常高的

https://bbs.chinauos.com/post/10049https://bbs.chinauos.com/post/10049这是作者分享的源码链接:(python实现)

https://gitee.com/zhangyongwei11/debreateforuoshttps://gitee.com/zhangyongwei11/debreateforuos

比较懒的人建议用脚本,改几个配置,执行几秒钟就打好包了。

http://www.dtcms.com/a/568460.html

相关文章:

  • React 12
  • 做网站 怎么发布专业模板建站哪家好
  • JavaSe—Set集合
  • 单调栈的“近亲”:用 O(n) 的「单调队列」征服「滑动窗口最大值」
  • Buildroot构建Linux系统根文件系统
  • 在自动驾驶数据闭环中的特征工程应用(上)
  • 【具身智能】Spatial Forcing 论文笔记 如何隐式地为 VLA 注入 3D 空间感知能力
  • 多模态技术深度探索:融合视觉与语言的AI新范式
  • 自动化单mysql多实例库的全量迁移脚本-v2版本
  • [CARLA系列--04]如何在Carla中去调用传感器模型--相机篇
  • 【ASP.NET MVC 进阶】DataAnnotations 特性验证全解析:从基础到避坑,让数据校验像 “安检“ 一样靠谱
  • 做ppt兼职的网站有哪些北京中燕建设公司网站
  • webgl 顶点、片元着色器传参,绘制彩色三角形
  • 实验室安全教育与管理平台学习记录(八)特种设备安全
  • 浙江网站制作国外翻墙设计网站
  • 《神经网络与深度学习》学习笔记一
  • 超越蓝牙与Wi-Fi,UWB技术如何解锁手机下一波创新浪潮?
  • 【VPX650G】基于 VPX 系统架构的 JFM9VU13P FPGA+JFMQL100TAI 超宽带信号处理平台
  • 软考 系统架构设计师系列知识点之杂项集萃(190)
  • Linux信号(下):信号保存和信号处理
  • 仅需一部智能手机,在NVIDIA Isaac Sim中重建真实场景:终极实战指南
  • Spring设计模式刨根问底
  • 河南郑州做网站汉狮网站赚钱的方式
  • 不是万维网的网站如何注册公司抖音号
  • AI 赋能科研实践:从选题到发表的技术重构之路
  • 技术的秩序:IT资产与配置管理的现代重构
  • 告别布线噩梦:8公里LoRa边缘网关如何重构工业物联边界
  • Python 图像处理利器:Pillow 深度详解与实战应用
  • 【数据结构】:二叉树——顺序结构,链式结构的实现及相关操作
  • RS485转以太网串口服务器-串口设备联网的理想选择