Debian_QT软件开发_deb打包发布2

《Debian_QT软件开发_deb打包发布》一文中,依赖的是dh-make去打包。本文将通过dpkg工具去实现打包。前者在麒麟系统安装器中,能正常的安装和卸载,后者笔者实测能安装,但卸载存在问题,只能通过dpkg去卸载。当然,前者打包比较繁琐,后者打包相对简单。

1 搭建打包环境

1.1 安装打包工具

debian发行版默认装有dpkg安装包工具,如果没有可以执行以下操作。

sudo apt update
sudo apt install dpkg
  • 1.
  • 2.

2 构建软件包

2.1 创建软件包目录

2.1.1 使用以下脚本build_dir.sh创建打包目录

这里文件夹名称没什么要求,可以自行定义。打包跟《Debian_QT软件开发_deb打包发布》一文一致。

build_dir.sh ipcapture-2024.07
  • 1.
#!/bin/bash

step=0
PACK_DIR_NAME=

read_user_input() {
    local result=
    while true
    do
        read -p "$1" result && {
        if [ ! $result ]; then
            echo "输入不能为空!!!请重新输入!!!"
        
        else
            break
        fi
    }
    done
    echo "$result"
}

step_printf() {
    echo "[$step] $1"
    let "step++"
}

if [ $# -eq 0 ]; then

    PACK_DIR_NAME=$(read_user_input "请创建打包目录:")
else
    PACK_DIR_NAME=$1
fi

step_printf "构建软件包目录结构"

mkdir -p $PACK_DIR_NAME/opt/
mkdir -p $PACK_DIR_NAME/usr/share/applications
mkdir -p $PACK_DIR_NAME/usr/share/icons/hicolor/scalable/apps
mkdir -p $PACK_DIR_NAME/usr/share/icons/hicolor/256x256/apps
mkdir -p $PACK_DIR_NAME/usr/share/icons/hicolor/128x128/apps
mkdir -p $PACK_DIR_NAME/usr/share/icons/hicolor/64x64/apps
mkdir -p $PACK_DIR_NAME/usr/share/icons/hicolor/32x32/apps
mkdir -p $PACK_DIR_NAME/usr/share/icons/hicolor/16x16/apps

step_printf "软件包目录构建结束"

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
2.1.2 补充软件包内容

安装包安装时,会根据软件包目录结构进行安装的。以下将会讲解完善哪些内容。

  1. 完善软件包目录opt/

将待打包的文件夹拷贝到软件包目录下opt/中,软件包发布后,安装成功会在系统/opt目录下创建该目录的。

cp /home/s/pack/ipcapture ./ipcapture-2024.07/opt/ -r
  • 1.
  1. 添加 .desktop 桌面配置文件(此处在DEBIAN目录的脚本中实现)

.desktop文件拷贝到软件包目录下usr/share/applications,安装包安装时,会自动拷贝.desktop文件到系统目录下/usr/share/applications

cp ./ipcapture-2024.07/opt/ipcapture/ipcapture.desktop ./ipcapture-2024.07/usr/share/applications
  • 1.
  1. 将软件图标复制到软件包usr/share/icons/hicolor/scalable/apps
cp ./ipcapture-2024.07/opt/ipcapture/ipcapture.svg ./ipcapture-2024.07/usr/share/icons/hicolor/scalable/apps
  • 1.
2.1.3 软件包目录下构建DEBIAN目录

注意:《Debian_QT软件开发_deb打包发布》一文中,创建的的是debian,不能和此处混淆,此处需要大写的DEBIAN,否则dpkg无法识别到。

  1. 新建DEBIANDEBIAN/controlDEBIAN/postinstDEBIAN/postrm
cd ipcapture-2024.07
sudo mkdir DEBIAN
cd DEBIAN
sudo touch control postinst postrm
  • 1.
  • 2.
  • 3.
  • 4.
  1. 添加以下内容至control

根据实际需求进行修改。

Package: ipcapture
Version: 1.0.0
Section: utils
Priority: optional
Architecture: amd64
Depends:
Installed-Size: 4096
Maintainer: Sanqian <493965614@qq.com>
Description: ipcapture deb package
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  1. 添加以下内容至postinst,该文件会在安装后调用

以下内容做了如下工作:

  • 创建日志文件,用于输出安装信息(这个可以去除,主要调试用);
  • 判断用户目录是否存在桌面目录;
  • 拷贝桌面快捷文件到指定目录(会在桌面显示应用图标);
  • 拷贝桌面属性文件到指定目录(会在菜单栏显示应用图标);
  • 软链接可执行文件到/usr/bin,这一步主要是为了桌面图标名称能正常显示名称;
  • 关联桌面属性文件。
#!/bin/bash
 
# Define the target directory for desktop files
desktop_dir=
desktop_dir_en="/home/$SUDO_USER/Desktop"
desktop_dir_zh_CN="/home/$SUDO_USER/桌面"
log_dir="/opt/ipcapture/log"
log_file="$log_dir/install.log"

if [ ! -d "log_file" ]; then
    mkdir -p "$log_dir"
    touch "$log_file"
    chmod +w "$log_file"
fi

echo "开始安装"  > "$log_file"

# Check if the desktop directory exists and is writable
if [ -d "$desktop_dir_en" ] && [ -w "$desktop_dir_en" ]; then
    desktop_dir="$desktop_dir_en"
    echo "$desktop_dir_en is exsit." >> "$log_file"

elif [ -d "$desktop_dir_zh_CN" ] && [ -w "$desktop_dir_zh_CN" ]; then
    desktop_dir="$desktop_dir_zh_CN"
    echo "$desktop_dir_zh_CN 目录存在。" >> "$log_file"
else
    echo "Desktop directory ($desktop_dir_en) is not accessible. Skipping desktop shortcut installation." >> "$log_file"
fi





if [ -d "/usr/share/applications/" ]; then
    # Copy the .desktop file to the desktop directory
    chmod +x /opt/ipcapture/ipcapture.desktop
    cp /opt/ipcapture/ipcapture.desktop /usr/share/applications/
    ln -s /opt/ipcapture/IPAudioCapture /usr/bin/ipcapture
    xdg-mime default ipcapture.desktop x-scheme-handler/ipcapture
    if [ -n "$desktop_dir" ]; then
        # xdg-desktop-icon install --novendor /usr/share/applications/ipcapture.desktop
        cp /opt/ipcapture/ipcapture.desktop "$desktop_dir/" 
    fi
    update-desktop-database
    echo "Desktop installed." >> "$log_file"
else
    echo "Desktop is not exsit. Skipping desktop installation." >> "$log_file"
fi


exit 0

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  1. 添加以下内容至postinst,该文件会在安装后调用

该脚本文件,在卸载完成后会被调用:
- 删除日志文件;
- 删除桌面快捷文件;
- 删除桌面属性文件;
- 删除链接文件。

#!/bin/bash
 
# Define the target directory for desktop files
desktop_dir=
desktop_dir_en="/home/$SUDO_USER/Desktop"
desktop_dir_zh_CN="/home/$SUDO_USER/桌面"
log_dir="/opt/ipcapture/log"



if [ -d "$log_dir" ]; then
    rm -rf "$log_dir"
fi

# Check if the desktop directory exists and is writable
if [ -d "$desktop_dir_en" ] && [ -w "$desktop_dir_en" ]; then
    desktop_dir="$desktop_dir_en"
    echo "$desktop_dir_en is exsit."

elif [ -d "$desktop_dir_zh_CN" ] && [ -w "$desktop_dir_zh_CN" ]; then
    desktop_dir="$desktop_dir_zh_CN"
    echo "$desktop_dir_zh_CN 目录存在。"
else
    echo "Desktop directory ($desktop_dir_en) is not accessible. Skipping desktop shortcut uninstallation."
fi

if [ -d "/usr/share/applications/" ]; then
    # Copy the .desktop file to the desktop directory
    # 删除桌面描述文件
    if [ -f "/usr/share/applications/ipcapture.desktop" ]; then
        # 卸载快捷图标
        if [ -n "$desktop_dir" ]; then
            # xdg-desktop-icon uninstall /usr/share/applications/ipcapture.desktop
            rm "$desktop_dir/ipcapture.desktop"
        fi
        rm /usr/share/applications/ipcapture.desktop
    fi
    # 删除链接文件
    if [ -L "/usr/bin/ipcapture" ]; then
        rm /usr/bin/ipcapture
    fi
    echo "Desktop  uninstalled."
else
    echo "Desktop directory is not exsit. Skipping desktop uninstallation."
    exit -1
fi
    
exit 0

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.

2.2 使用 dpkg 构建软件包

  • 构建

ipcapture-2024.07是笔者创建的软件包文件夹,要构建deb文件,需要执行以下命令:

s@s-pc:~/IPAudioCapture/pack$ sudo dpkg -b ipcapture-2024.07
dpkg-deb: 正在 'ipcapture-2024.07.deb' 中构建软件包 'ipcapture'。
  • 1.
  • 2.
  • 安装
sudo dpkg -i ipcapture-2024.07.deb
  • 1.
  • 卸载
sudo dpkg -r ipcapture
  • 1.
  • 安装成功

    • 桌面会显示图标
    • 菜单栏会显示图标
s@s-pc:/home$ dpkg --list ipcapture
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触>
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称           版本         体系结构     描述
+++-==============-============-============-=================================
ii  ipcapture      1.0.0        amd64        ipcapture deb package
lines 1-6/6 (END)...skipping...
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
||/ 名称           版本         体系结构     描述
+++-==============-============-============-=================================
ii  ipcapture      1.0.0        amd64        ipcapture deb package
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.