制作新版deb包时,如何指定安装前清除旧版本?
如何在Deb包中强制安装新版本前Purge旧版本
这个问题我之前帮好几个开发者解决过——你提到的Replaces和Conflicts字段确实没法实现Purge旧版本的需求:Replaces只会让新包覆盖旧包的文件,Conflicts最多阻止新旧包共存,但都不会清理旧包的配置文件、遗留的非标准文件。要实现安装新版本前自动彻底清除旧版本,得靠Deb包的preinst脚本来实现,这是最直接有效的方案。
具体实现步骤:
创建preinst脚本
在你的Deb包构建目录的DEBIAN文件夹下,新建一个名为preinst的文件,内容如下:#!/bin/sh set -e # 定义旧包的名称(如果新旧包名一致,直接写包名即可) OLD_PACKAGE="program" # 检查旧包是否已安装 if dpkg-query -W -f='${Status}' "$OLD_PACKAGE" 2>/dev/null | grep -q "install ok installed"; then echo "正在Purge旧版本的$OLD_PACKAGE..." # 执行purge操作,强制清除旧包及其配置文件 dpkg --purge "$OLD_PACKAGE" || true fi exit 0- 这里的
set -e确保脚本遇到错误就停止(除了我们用|| true忽略的purge可能的异常) dpkg-query用来检测旧包是否处于已安装状态dpkg --purge会彻底删除旧包的所有文件,包括配置文件
- 这里的
设置脚本权限
必须给preinst脚本设置可执行权限,否则Deb包安装时会忽略它:chmod 755 DEBIAN/preinst构建并测试Deb包
按正常流程构建你的program_2.0.deb,然后测试安装:dpkg -i program_2.0.deb安装前你会看到脚本输出的提示,旧版本会被自动purge,之后才会安装新版本。
注意事项:
- 如果你的新旧包包名完全一致(只是版本不同),脚本里的
OLD_PACKAGE直接写包名即可,dpkg会识别到旧版本并处理 - 脚本里的
|| true是为了避免旧包purge时出现意外错误导致新包安装中断,根据你的实际需求可以调整 - 不要尝试用
Depends或其他控制字段实现这个需求,Debian的包管理体系里这些字段没有触发purge的逻辑,只有preinst脚本能做到这种自定义前置操作
内容的提问来源于stack exchange,提问作者Маргарян Вардан
相关产品推荐
相关产品推荐

