【国产桌面操作系统】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 Application
    A 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}" ]; then
    echo "错误: 未找到${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" ]; then
    EXECUTABLE_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" ]; then
    cp "$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/*; do
    if [ -d "\${USER_DIR}" ] && [ -d "\${USER_DIR}/Desktop" ]; then
        USER_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 || true
        chmod +x "\${USER_DIR}/Desktop/${PACKAGE_NAME}.desktop" 2>/dev/null || true
    fi
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

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

相关推荐
筑梦之路4 天前
openEuler 24.03 LTS 版本网络镜像引导安装——筑梦之路
国产操作系统·华为欧拉·网络引导安装
Linux极客4 个月前
通过政采认证的新支点服务器操作系统V7特点分析
国产操作系统·新支点操作系统·中兴通讯
MinterFusion4 个月前
如何在VirtalBox中安装deepin操作系统虚拟机(v0.1.0)(上)
虚拟机·deepin·virtualbox·国产操作系统·系统维护·明德融创·虚拟技术
MinterFusion4 个月前
如何在VirtalBox中安装deepin操作系统虚拟机(v0.1.0)(下)
运维·虚拟机·deepin·virtualbox·国产操作系统·明德融创·虚拟技术
Linux极客5 个月前
中兴新支点操作系统发布水电企业作业安全管控信创解决方案
国产操作系统·中兴新支点·中兴通讯
鹏大师运维7 个月前
统信 UOS OpenSSL 漏洞如何修复?外网 / 内网两种方式一次讲清
linux·运维·openssl·国产操作系统·统信uos·麒麟桌面操作系统·补丁修复
Lancker7 个月前
定制侠 一个国产纯血鸿蒙APP的诞生过程
android·华为·智能手机·鸿蒙·国产操作系统·纯血鸿蒙·华为鸿蒙
NotStrandedYet7 个月前
《国产系统运维笔记》第4期:银河麒麟服务器系统V10&V11如何设置 root 用户自动登录
运维·信创·kylin·国产化·国产操作系统·银河麒麟·信创运维
NotStrandedYet8 个月前
CentOS停更后的新选择:图文详解安装6.x内核openEuler+GNOME图形桌面
linux·运维·信创·国产化·openeuler·国产操作系统
李小白杂货铺8 个月前
国产操作系统/Linux桌面系统使用手记
ubuntu·国产操作系统·银河麒麟·统信·国产cpu·linux桌面系统·国产硬件平台