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.desktopTerminal=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中手动添加清理命令
关键注意事项
- 路径一致性:
.desktop文件中的路径必须指向安装后路径而非打包路径 - 文件权限:所有脚本必须赋予执行权限(
chmod +x) - 架构匹配:
control文件中的Architecture必须与构建环境一致 - 残留清理:应用运行时生成的日志等文件需在
postrm中额外添加删除命令 - 脚本首行:所有维护脚本必须以
#!/bin/sh开头
2840

被折叠的 条评论
为什么被折叠?



