Debian_QT软件开发_deb打包发布2
在《Debian_QT软件开发_deb打包发布》
一文中,依赖的是dh-make
去打包。本文将通过dpkg
工具去实现打包。前者在麒麟系统安装器中,能正常的安装和卸载,后者笔者实测能安装,但卸载存在问题,只能通过dpkg去卸载
。当然,前者打包比较繁琐,后者打包相对简单。
1 搭建打包环境
1.1 安装打包工具
debian发行版默认装有dpkg
安装包工具,如果没有可以执行以下操作。
sudo apt update
sudo apt install dpkg
2 构建软件包
2.1 创建软件包目录
2.1.1 使用以下脚本build_dir.sh
创建打包目录
这里文件夹名称没什么要求,可以自行定义。打包跟《Debian_QT软件开发_deb打包发布》
一文一致。
build_dir.sh ipcapture-2024.07
#!/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 "软件包目录构建结束"
2.1.2 补充软件包内容
安装包安装时,会根据软件包目录结构进行安装的。以下将会讲解完善哪些内容。
- 完善软件包目录
opt/
将待打包的文件夹拷贝到软件包目录下opt/
中,软件包发布后,安装成功会在系统/opt
目录下创建该目录的。
cp /home/s/pack/ipcapture ./ipcapture-2024.07/opt/ -r
添加(此处在.desktop
桌面配置文件DEBIAN
目录的脚本中实现)
将.desktop
文件拷贝到软件包目录下usr/share/applications
,安装包安装时,会自动拷贝.desktop
文件到系统目录下/usr/share/applications
cp ./ipcapture-2024.07/opt/ipcapture/ipcapture.desktop ./ipcapture-2024.07/usr/share/applications
- 将软件图标复制到软件包
usr/share/icons/hicolor/scalable/apps
中
cp ./ipcapture-2024.07/opt/ipcapture/ipcapture.svg ./ipcapture-2024.07/usr/share/icons/hicolor/scalable/apps
2.1.3 软件包目录下构建DEBIAN
目录
注意:《Debian_QT软件开发_deb打包发布》
一文中,创建的的是debian
,不能和此处混淆,此处需要大写的DEBIAN
,否则dpkg
无法识别到。
- 新建
DEBIAN
、DEBIAN/control
、DEBIAN/postinst
、DEBIAN/postrm
cd ipcapture-2024.07
sudo mkdir DEBIAN
cd DEBIAN
sudo touch control postinst postrm
- 添加以下内容至
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
- 添加以下内容至
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
- 添加以下内容至
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
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'。
- 安装
sudo dpkg -i ipcapture-2024.07.deb
- 卸载
sudo dpkg -r ipcapture
-
安装成功
- 桌面会显示图标
- 菜单栏会显示图标
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