【国产桌面操作系统】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

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

相关推荐
Light602 个月前
领码前瞻|国产操作系统闯关之路:从创新到应用
云原生·国产操作系统·ai赋能·自主可控·生态建设
皓月盈江3 个月前
Linux Deepin深度操作系统应用商店加载失败,安装星火应用商店
linux·debian·deepin·国产操作系统·深度操作系统·星火应用商店·deepin应用商店加载失败
鹏大师运维3 个月前
银河麒麟桌面操作系统:自定义截图快捷键操作指南
linux·运维·快捷键·国产操作系统·截图·麒麟kylinos·桌面操作系统
鹏大师运维3 个月前
MBR与GPT分区表深度解析:硬盘分区该怎么选?
linux·运维·服务器·gpt·国产操作系统·mbr·统信uos
识途老码5 个月前
UOS 20 Pro为国际版WPS设置中文菜单
信创·wps·uos·国产操作系统·统信
识途老码5 个月前
UOS无法安装deb软件包
信创·uos·国产操作系统·统信操作系统
xyhshen5 个月前
麒麟v10+信创x86处理器离线搭建k8s集群完整过程
docker·容器·kubernetes·国产操作系统
轻栈OS工坊5 个月前
深度Deepin操作系统:国产Linux桌面系统的崛起之路
国产操作系统·深度系统·deepin操作系统
鹏大师运维5 个月前
中科方德鸳鸯火锅平台使用教程:轻松运行Windows应用!
linux·windows·国产操作系统·统信uos·中科方德·麒麟2503·鸳鸯火锅