【国产桌面操作系统】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.5502
https://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/10049
https://bbs.chinauos.com/post/10049这是作者分享的源码链接:(python实现)
https://gitee.com/zhangyongwei11/debreateforuos
https://gitee.com/zhangyongwei11/debreateforuos
比较懒的人建议用脚本,改几个配置,执行几秒钟就打好包了。
