在Ubuntu下将AppImage打包成deb

1. deb包安装路径原理

deb包安装时会将内部文件释放至根目录 / 下。打包时需要预先创建完整的安装目录结构。示例对比:

打包目录结构

source/
├── DEBIAN
│   ├── control
│   ├── postinst
│   └── postrm
└── opt
    └── Test
        ├── Test
        └── xxx

安装后目录结构

/
└── opt
    └── Test
        ├── Test
        └── xxx

关键点

  • DEBIAN 目录必须位于打包目录顶层
  • 所有安装文件需按目标路径层级放置在 source 目录下
2. 安装路径规划

以安装到 /opt/Test/ 为例:

依赖文件我这里是通过linuxdeployqt工具打包好的Qt程序,其他

# 创建打包框架
mkdir -p /TestSetup/{output,source/opt/Test}
mv 依赖文件 /TestSetup/source/opt/Test/

3. 桌面快捷方式配置

编辑 Test.desktop 文件:

[Desktop Entry]
Type=Application
Name=My Test                  # 显示名称
Exec=/opt/Test/Test           # 执行路径
Icon=/opt/Test/Test.png       # 图标路径
Comment=This is my test       # 描述信息
Terminal=true                 # 是否启用终端

注意事项

  • 需赋予执行权限:chmod +x Test.desktop
  • Terminal=true 会同时打开终端窗口
  • 图标文件需为绝对路径
4. control文件配置

DEBIAN/control 文件示例:

Package: mytest
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends: 
Installed-Size: 512
Maintainer: 123@163.com
Description: My test application package

字段说明

  • Package:卸载时使用的包名
  • Architecture:必须匹配目标系统架构
  • Depends:可声明依赖包(如:libc6 (>= 2.15)
5. 安装脚本配置

DEBIAN/postinst(安装后脚本)

#!/bin/sh
set -eu  # 严格模式:未定义变量报错,命令失败退出

# ===== 可配置变量(根据应用修改) =====
INSTALL_DIR="/opt/Test"          # 安装根目录
DESKTOP_FILE="Test.desktop"      # 快捷方式文件名
APP_NAME="Test"                  # 应用名称(用于日志)
SYSTEM_APPS_DIR="/usr/share/applications"  # 系统菜单目录

# ===== 主逻辑 =====
main() {
    echo "[INFO] 开始配置 ${APP_NAME} 安装后环境"
    
    # 步骤1: 设置桌面快捷方式权限 (推荐755而非777)
    desktop_path="${INSTALL_DIR}/${DESKTOP_FILE}"
    if [ -f "$desktop_path" ]; then
        chmod 755 "$desktop_path" || warn "无法设置 ${DESKTOP_FILE} 权限"
    else
        warn "未找到桌面文件: $desktop_path"
    fi

    # 步骤2: 复制到系统菜单目录
    mkdir -p "$SYSTEM_APPS_DIR"
    if cp -f "$desktop_path" "$SYSTEM_APPS_DIR/"; then
        echo "[OK] 已添加系统菜单快捷方式"
    else
        warn "复制到系统菜单失败"
    fi

    # 步骤3: 智能添加用户桌面快捷方式
    add_user_desktop_shortcut

    # 步骤4: 更新桌面数据库
    if command -v update-desktop-database >/dev/null; then
        update-desktop-database -q "$SYSTEM_APPS_DIR" && echo "[OK] 桌面数据库已更新"
    fi

    echo "[SUCCESS] ${APP_NAME} 安装后配置完成"
}

# ===== 函数:添加用户桌面快捷方式 =====
add_user_desktop_shortcut() {
    # 确定当前用户(优先使用 sudo 用户)
    target_user="${SUDO_USER:-$USER}"
    if [ -z "$target_user" ]; then
        warn "无法确定用户,跳过桌面快捷方式"
        return 1
    fi

    # 获取用户桌面路径(兼容 GNOME/KDE/XFCE)
    user_home=$(getent passwd "$target_user" | cut -d: -f6)
    if [ -z "$user_home" ]; then
        warn "用户 $target_user 不存在"
        return 1
    fi

    user_desktop="${user_home}/Desktop"
    if [ ! -d "$user_desktop" ]; then
        # 尝试其他常见桌面路径
        user_desktop="${user_home}/Schreibtisch"  # 德语
        [ -d "$user_desktop" ] || user_desktop="${user_home}/Escritorio"  # 西班牙语
        [ -d "$user_desktop" ] || user_desktop="${user_home}/Bureau"      # 法语
        if [ ! -d "$user_desktop" ]; then
            warn "未找到桌面目录: $user_desktop"
            return 1
        fi
    fi

    # 复制快捷方式并设置权限
    if cp -f "$desktop_path" "$user_desktop/"; then
        chmod 755 "$user_desktop/$DESKTOP_FILE" || true
        echo "[OK] 已添加用户桌面快捷方式 (用户: $target_user)"
    else
        warn "复制到用户桌面失败"
    fi
}

# ===== 辅助函数 =====
warn() { echo "[WARNING] $1" >&2; }  # 警告信息输出到 stderr

# ===== 执行主函数 =====
main

作用:创建桌面/菜单快捷方式

DEBIAN/postrm(卸载后脚本)

#!/bin/sh
set -eu

# ===== 可配置变量(与 postinst 一致) =====
INSTALL_DIR="/opt/Test"
DESKTOP_FILE="Test.desktop"
APP_NAME="Test"
SYSTEM_APPS_DIR="/usr/share/applications"

# ===== 主逻辑 =====
main() {
    echo "[INFO] 开始清理 ${APP_NAME} 残留文件"

    # 步骤1: 删除系统菜单快捷方式
    if rm -f "$SYSTEM_APPS_DIR/$DESKTOP_FILE"; then
        echo "[OK] 已移除系统菜单快捷方式"
    fi

    # 步骤2: 智能移除用户桌面快捷方式
    remove_user_desktop_shortcut

    # 步骤3: 清理应用残留文件(按需添加)
    #cleanup_residual_files

    # 步骤4: 更新桌面数据库
    if command -v update-desktop-database >/dev/null; then
        update-desktop-database -q "$SYSTEM_APPS_DIR"
    fi

    echo "[SUCCESS] ${APP_NAME} 卸载完成"
}

# ===== 函数:移除用户桌面快捷方式 =====
remove_user_desktop_shortcut() {
    # 遍历所有可能用户
    for user in $(getent passwd | cut -d: -f1); do
        user_home=$(getent passwd "$user" | cut -d: -f6)
        [ -z "$user_home" ] && continue

        # 检查常见桌面路径
        for desktop_dir in "Desktop" "Schreibtisch" "Escritorio" "Bureau"; do
            target_file="${user_home}/${desktop_dir}/${DESKTOP_FILE}"
            if [ -f "$target_file" ]; then
                rm -f "$target_file" && echo "[OK] 已移除用户桌面快捷方式 (用户: $user)"
            fi
        done
    done
}

# ===== 函数:清理残留文件(示例) =====
cleanup_residual_files() {
    # 示例:删除日志和临时文件(根据实际路径修改)
    log_dir="/var/log/${APP_NAME}"
    temp_dir="/tmp/${APP_NAME}_cache"

    [ -d "$log_dir" ] && rm -rf "$log_dir" && echo "[OK] 已清理日志目录"
    [ -d "$temp_dir" ] && rm -rf "$temp_dir" && echo "[OK] 已清理临时文件"
}

# ===== 辅助函数 =====
warn() { echo "[WARNING] $1" >&2; }

# ===== 执行主函数 =====
main

作用:清理安装时创建的快捷方式

6. 构建deb包
cd /TestSetup/source
dpkg -b . ../output/test_amd64_0.1.0.deb

7. 安装与卸载

安装命令

sudo dpkg -i /TestSetup/output/test_amd64_0.1.0.deb

卸载命令

sudo apt-get remove mytest  # 使用control中定义的包名

安装效果

  • 自动创建桌面快捷方式
  • 在开始菜单生成入口(路径:/usr/share/applications/
  • 应用文件安装至 /opt/Test/

卸载效果

  • 自动删除所有安装文件
  • 清理桌面/菜单快捷方式
  • 日志文件需在postrm中手动添加清理命令

关键注意事项

  1. 路径一致性.desktop 文件中的路径必须指向安装后路径而非打包路径
  2. 文件权限:所有脚本必须赋予执行权限(chmod +x
  3. 架构匹配control 文件中的 Architecture 必须与构建环境一致
  4. 残留清理:应用运行时生成的日志等文件需在 postrm 中额外添加删除命令
  5. 脚本首行:所有维护脚本必须以 #!/bin/sh 开头
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值