Tauri deb 打包时自动添加 preinst、 postinst、 prerm 和 postrm 脚本

1,396 阅读2分钟

太长不看版

在 tauri.conf.json 的同级目录下创建一个 DEBIAN 文件夹,在文件夹中放入要添加的脚本文件, 编辑 tauri.conf.json 中的 tauri.bundle.deb.files 配置项

{
    "tauri":{
        ...
        "bundle":{
            "deb": {
                "files": {
                  "../control/": "./DEBIAN/"
                }
            }
        }
    }
}

详细分析过程

什么是deb包的脚本文件

根据 debian官网介绍: deb包可以提供脚本作为软件包的一部分,当软件包被安装、升级或删除时,软件包管理系统将为你运行这些脚本。这些脚本就是软件包元数据文件 preinstpostinstprermpostrm

Tauri 如何添加此类文件

脚本文件一般是被存放在工作目录的 DEBIAN 文件夹下的,然后,使用 dpkg-deb 命令将这个工作目录打包成一个 .deb 文件。文件将会被打包到deb文件中的 control.tar.gz 中。

但是,Tauri使用了cargo-bundle 进行编译,在 Tauri 编译过程中,我们无法自行在编译目录下创建 DEBIAN 文件,这就导致我们无法在编译的过程中将脚本文件打包到 control.tar.gz 中。

那有什么办法能让我们介入编译过程呢,官方提供了 自定义文件 的方法。

查看结构

首先我们来看一下 Tauri 在编译完成后产出了什么

tree my-app/src-tauri/target/release/bundle/deb/my-app_0.0.1_amd64
./  
├── control  
│   ├── control
│   └── md5sums  
├── control.tar.gz  
├── data  
│   └── usr  
│       ├── bin  
│       │   └── my-app  
│       ├── lib  
│       │   └── my-app
│       └── share  
│           ├── applications  
│           │   └── my-app.desktop  
│           └── icons  
│               └── hicolor  
│                   ├── 129x129  
│                   │   └── apps  
│                   │       └── my-app.png  
│                   ├── 257x257@2  
│                   │   └── apps  
│                   │       └── my-app.png  
│                   └── 33x33  
│                       └── apps  
│                           └── my-app.png  
├── data.tar.gz  
└── debian-binary

可以看到这和官方文档中的路径 /usr/share/README.md 是吻合的,而生成的 control 文件夹就对应生成了 control.tar.gz

那可以这样考虑:Custom File 的配置路径使用相对路径的方式保存到 control 文件夹中是否可行。

添加文件

tauri.conf.json 的同级目录下创建一个 DEBIAN 文件夹(只是为了跟随工程习惯,路径找得到就行),在文件夹中放入要添加的脚本文件,此处加入 postinst 文件

#!/bin/bash

# 创建桌面图标
cat > /usr/share/applications/my-app.desktop << EOF
[Desktop Entry]
Type=Application
Exec=/usr/bin/my-app
Icon=/usr/share/icons/hicolor/129x129/apps/my-app.png
Name=my-app
Categories=Productivity;
EOF

# 更新桌面图标缓存
if hash gtk-update-icon-cache 2>/dev/null; then
    gtk-update-icon-cache -f -t /usr/share/icons/hicolor
fi

# 获取当前的图形会话用户
user=$(who | grep '(:0)' | awk '{print $1}')

# 检查桌面目录的名称并创建桌面图标
if su -c "[ -d ~/桌面 ]" $user ; then
	su -c "ln -sf /usr/share/applications/my-app.desktop ~/桌面/" $user
else
	su -c "	ln -sf /usr/share/applications/my-app.desktop ~/Desktop/" $user
fi

tauri.conf.json 文件中配置引入位置

{
    "tauri":{
        ...
        "bundle":{
            "deb": {
                "files": {
                  "../control/": "./DEBIAN/"
                }
            }
        }
    }
}

检查编译结果

control 文件夹内结果:

image.png

deb 包内 control.tar.gz 结果:

image.png

可以发现,脚本文件被成功放入了 deb 打包文件中,并且安装deb文件的过程能够成功运行脚本。