统信UOS(Debian)环境 pyinstaller 打包 Python 程序DEBIAN 文件夹并设置自动安装依赖程序

DEBIAN/control

Debian 软件包(.deb)的 “身份文件”,存放包的名称、版本、依赖、维护者等关键信息,其格式有严格规范。

Package: example-tool
Version: develop-env
Section: utils
Priority: optional
Architecture: arm64
Depends: yad,unzip,p7zip-full
Maintainer: Yogile <575969143@qq.com>
Description: 动态更新工具
 动态更新工具: 此uos arm64 ft2000版本
 仅支持统信UOS飞腾TF2000芯片且为1070及以上版本系统

说明:

字段 行为差异
Pre-Depends 严格要求依赖包在本包安装之前已安装,dpkg 不会自动处理
Depends 允许依赖包和本包一起安装,使用 apt install ./xxx.deb 时会自动处理

DEBIAN/postinst

Debian 软件包(.deb)中的一个维护脚本,全称为 post-installation,直译是 “安装后”。它在软件包安装完成(文件解压到系统后)自动执行,用于完成软件安装后的收尾配置工作(比如创建用户、启动服务、生成配置文件、设置权限等)。

#!/bin/sh
set -e

APP_DIR="/opt/apps/example-tool"
APP_NAME="example-tool_linux_arm64_normal"
BACKUP_DIR="/tmp/example-tool-backup"

# 设置目录权限
mkdir -p "$APP_DIR"
chown root:root "$APP_DIR"
chmod 755 "$APP_DIR"

# 设置可执行权限
chmod +x "$APP_DIR/$APP_NAME"
chmod +x "$APP_DIR/Updater"

# 恢复用户配置
if [ -f "$BACKUP_DIR/app_config.ini" ]; then
    echo "postinst: 恢复用户配置 (app_config.ini)..."
    cp "$BACKUP_DIR/app_config.ini" "$APP_DIR/" || true
fi

# 恢复 depend/config.ini
if [ -f "$BACKUP_DIR/depend/config.ini" ]; then
    echo "postinst: 恢复用户配置 (depend/config.ini)..."
    mkdir -p "$APP_DIR/depend"
    cp "$BACKUP_DIR/depend/config.ini" "$APP_DIR/depend/" || true
fi

# 恢复当前模板文件
if [ -f "$BACKUP_DIR/lib/当前模板1月1日都江堰市党政班子领导政务活动预报.docx" ]; then
    echo "postinst: 恢复当前模板文件..."
    mkdir -p "$APP_DIR/depend/lib"
    cp "$BACKUP_DIR/lib/当前模板1月1日都江堰市党政班子领导政务活动预报.docx" "$APP_DIR/depend/lib/" || true
fi

# 确保配置文件可写
chmod +w "$APP_DIR/app_config.ini" || true

# 恢复输出目录
if [ -d "$BACKUP_DIR/输出" ]; then
    echo "postinst: 恢复输出目录..."
    cp -r "$BACKUP_DIR/输出" "$APP_DIR/" || true
fi

# 创建输出目录(如果不存在)
mkdir -p "$APP_DIR/输出"
chmod 755 "$APP_DIR/输出"

# 清理备份
rm -rf "$BACKUP_DIR"

# 更新桌面数据库
update-desktop-database || true

echo "postinst: 安装完成"
exit 0

DEBIAN/postrm

负责卸载 / 移除阶段后续清理的关键脚本,配套的核心控制文件。

#!/bin/sh
set -e

APP_DIR="/opt/apps/example-tool"

# 完全卸载模式
if [ "$1" = "purge" ] || [ "$1" = "remove" ]; then
    # 清理桌面数据库
    update-desktop-database 2>/dev/null || true
    
    # 清理残留目录
    if [ -d "$APP_DIR" ]; then
        echo "postrm: 清理残留文件..."
        rm -rf "$APP_DIR"
    fi
fi

echo "postrm: 卸载完成"
exit 0

DEBIAN/preinst

负责安装 / 升级前执行的关键维护脚本,直译是 “安装前”,它在 Debian 包的文件被解压到系统之前自动执行,核心职责是为安装 / 升级操作做前置准备。

#!/bin/sh
set -e

APP_DIR="/opt/apps/example-tool"
BACKUP_DIR="/tmp/example-tool-backup"

# 检查并停止运行中的程序(只匹配已安装的实际程序进程,避免误杀安装进程)
echo "preinst: 检查运行中的程序..."
if pgrep -f "/opt/apps/example-tool/" > /dev/null 2>&1; then
    echo "preinst: 检测到程序正在运行,尝试关闭..."
    pkill -f "/opt/apps/example-tool/" || true
    sleep 1
fi

# 备份用户配置
if [ -f "$APP_DIR/app_config.ini" ]; then
    echo "preinst: 备份用户配置 (app_config.ini)..."
    mkdir -p "$BACKUP_DIR"
    cp "$APP_DIR/app_config.ini" "$BACKUP_DIR/" || true
fi

# 备份 depend/config.ini
if [ -f "$APP_DIR/depend/config.ini" ]; then
    echo "preinst: 备份用户配置 (depend/config.ini)..."
    mkdir -p "$BACKUP_DIR/depend"
    cp "$APP_DIR/depend/config.ini" "$BACKUP_DIR/depend/" || true
fi

# 备份当前模板文件(用户可能已修改)
if [ -f "$APP_DIR/depend/lib/当前模板1月1日都江堰市党政班子领导政务活动预报.docx" ]; then
    echo "preinst: 备份当前模板文件..."
    mkdir -p "$BACKUP_DIR/lib"
    cp "$APP_DIR/depend/lib/当前模板1月1日都江堰市党政班子领导政务活动预报.docx" "$BACKUP_DIR/lib/" || true
fi

# 备份输出目录内容
if [ -d "$APP_DIR/输出" ]; then
    echo "preinst: 备份输出目录..."
    mkdir -p "$BACKUP_DIR"
    cp -r "$APP_DIR/输出" "$BACKUP_DIR/" || true
fi

echo "preinst: 预处理完成"

DEBIAN/prerm

负责软件包移除 / 升级前的预处理工作,直译是 “移除前”。它在 Debian 包被卸载(remove)彻底删除(purge)升级时,先于文件删除 / 替换执行。

#!/bin/sh
set -e

APP_DIR="/opt/apps/example-tool"

# 停止运行中的程序(只匹配已安装的实际程序进程)
echo "prerm: 检查运行中的程序..."
if pgrep -f "/opt/apps/example-tool/" > /dev/null 2>&1; then
    echo "prerm: 检测到程序正在运行,尝试关闭..."
    pkill -f "/opt/apps/example-tool/" || true
    sleep 1
fi

# 清理菜单缓存
update-desktop-database || true

echo "prerm: 预处理完成"
posted @ 2026-03-03 16:39  Yogile  阅读(80)  评论(0)    收藏  举报