跳至主要内容

Linux 捆绑包

Linux 的 Tauri 应用程序通过 Debian 捆绑包(.deb 文件)或 AppImage(.AppImage 文件)进行分发。Tauri CLI 默认自动将你的应用程序代码捆绑到这些格式中。请注意,.deb.AppImage 捆绑包只能在 Linux 上创建,因为跨编译尚未实现。

注意

macOS 和 Linux 上的 GUI 应用程序不会从 shell dotfiles(.bashrc.bash_profile.zshrc 等)继承 $PATH。查看 Tauri 的 fix-path-env-rs crate 以解决此问题。

要构建并将 Tauri 应用程序捆绑到单个可执行文件中,只需运行以下命令

npm run tauri build

它将构建你的前端(如果已配置,请参阅 beforeBuildCommand),编译 Rust 二进制文件,收集所有外部二进制文件和资源,最后生成简洁的特定于平台的捆绑包和安装程序。

限制

glibc 等核心库经常与旧系统不兼容。出于此原因,你必须使用你打算支持的最旧基本系统来构建你的 Tauri 应用程序。相对较旧的系统(如 Ubuntu 18.04)比 Ubuntu 22.04 更合适,因为在 Ubuntu 22.04 上编译的二进制文件对 glibc 版本的要求更高,因此在旧系统上运行时,你会遇到运行时错误,如 /usr/lib/libc.so.6: version 'GLIBC_2.33' not found。我们建议使用 Docker 容器或 GitHub Actions 为 Linux 构建你的 Tauri 应用程序。

请参阅问题 tauri-apps/tauri#1355rust-lang/rust#57497,以及 AppImage 指南 以获取更多信息。

Debian

Tauri 捆绑器生成的 Debian 软件包包含将你的应用程序运送到基于 Debian 的 Linux 发行版所需的一切,定义应用程序的图标,生成桌面文件,并指定依赖项 libwebkit2gtk-4.0-37libgtk-3-0,以及如果你的应用程序使用系统托盘,则指定 libappindicator3-1

自定义文件

如果您需要更多控制,Tauri 会为 Debian 包公开一些配置。

如果您的应用依赖于其他系统依赖项,您可以在 tauri.conf.json > tauri > bundle > deb > depends 中指定它们。

要将自定义文件包含在 Debian 包中,您可以在 tauri.conf.json > tauri > bundle > deb > files 中提供文件或文件夹列表。配置对象将 Debian 包中的路径映射到文件系统中文件的路径,该路径相对于 tauri.conf.json 文件。这是一个示例配置

{
"tauri": {
"bundle": {
"deb": {
"files": {
"/usr/share/README.md": "../README.md", // copies the README.md file to /usr/share/README.md
"usr/share/assets": "../assets/" // copies the entire assets directory to /usr/share/assets
}
}
}
}
}

如果您需要以跨平台的方式打包文件,请查看 Tauri 的 资源sidecar 机制。

AppImage

AppImage 是一种发行格式,它不依赖于系统安装的包,而是打包应用程序所需的所有依赖项和文件。因此,输出文件更大,但更容易分发,因为它受许多 Linux 发行版支持,并且无需安装即可执行。用户只需使文件可执行(chmod a+x MyProject.AppImage),然后就可以运行它(./MyProject.AppImage)。

AppImage 很方便,如果无法针对发行版的包管理器制作包,它可以简化分发过程。不过,您应该谨慎使用它,因为文件大小从 2-6MB 范围增长到 70MB 以上。

注意

如果您的应用播放音频/视频,您需要启用 tauri.conf.json > tauri > bundle > appimage > bundleMediaFramework。这会增加 AppImage 捆绑包的大小,以包含媒体播放所需的附加 gstreamer 文件。此标志目前仅在 Ubuntu 构建系统上受支持。

交叉编译适用于 ARM 设备的 Tauri 应用程序

本指南解释了如何为基于 ARM 的设备(例如 Raspberry Pi)交叉编译您的 Tauri 应用程序。由于 RAM 有限,直接在设备上编译可能不可行,因此我们将探讨两种方法:使用 Linux 或 Windows 上的 WSL 手动编译以及使用 GitHub Action 自动交叉编译。

手动编译

当您不需要频繁编译应用程序并更喜欢一次性设置时,手动编译是合适的。请按照以下步骤操作

先决条件

危险

AppImage 只能在 ARM 设备上构建。为了避免 Tauri 构建它,您可以在 src-tauri 文件夹中自定义 tauri.conf.json。调整 "targets" 数组以仅包含 ARM 设备所需的平台。例如

"目标": ["deb", "nsis", "msi", "app", "dmg", "updater"],

或者,在调用 `tauri build` 时,可以使用 `--bundles` 标志。

  • 对于 Windows,使用 WSL 设置指南 在 WSL 上安装 Debian。
  • 在 Linux 上,构建机器要求 GLIBC 版本等于或早于目标设备。使用以下命令进行检查:ldd --version
  • 对于本指南,使用基于 Debian/Ubuntu 的 Linux 发行版,因为所示命令使用 `apt` 包管理器,并且已在 Debian 11 上进行过测试。

交叉编译

现在,让我们为 ARM 交叉编译 Tauri 应用程序

  1. 为所需的架构安装 Rust 目标

    • 对于 ARMv7(32 位):rustup target add armv7-unknown-linux-gnueabihf
    • 对于 ARMv8(ARM64,64 位):rustup target add aarch64-unknown-linux-gnu
  2. 为所选架构安装相应的链接器

    • 对于 ARMv7:sudo apt install gcc-arm-linux-gnueabihf
    • 对于 ARMv8(ARM64):sudo apt install gcc-aarch64-linux-gnu
  3. 打开或创建文件 <project-root>/.cargo/config.toml,并相应添加以下配置

    [target.armv7-unknown-linux-gnueabihf]
    linker = "arm-linux-gnueabihf-gcc"

    [target.aarch64-unknown-linux-gnu]
    linker = "aarch64-linux-gnu-gcc"
  4. 在包管理器中启用相应架构

    • 对于 ARMv7:sudo dpkg --add-architecture armhf
    • 对于 ARMv8(ARM64):sudo dpkg --add-architecture arm64
  5. 调整包源

在 Debian 上,此步骤不是必需的,但在其他发行版上,你可能需要编辑 /etc/apt/sources.list 以包含 ARM 架构变体。例如,在 Ubuntu 22.04 中,将这些行添加到文件的底部(记住用 Ubuntu 版本的代号替换 jammy

deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main restricted universe multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security multiverse

然后,为了防止出现主包问题,你必须将正确的架构添加到文件中之前包含的所有其他行。对于标准 64 位系统,你需要添加 [arch=amd64],Ubuntu 22.04 上的完整文件类似于此

点击查看 Ubuntu 22.04 的完整示例文件
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy universe
# deb-src http://archive.ubuntu.com/ubuntu/ jammy universe
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates universe
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse

deb [arch=amd64] http://security.ubuntu.com/ubuntu/ jammy-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted
deb [arch=amd64] http://security.ubuntu.com/ubuntu/ jammy-security universe
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security universe
deb [arch=amd64] http://security.ubuntu.com/ubuntu/ jammy-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security multiverse

deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main restricted universe multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security multiverse

进行这些更改后,通过重新运行步骤 4 中的命令,验证包管理器中是否仍然启用了 armhf/arm64 架构。

  1. 更新包信息:sudo apt-get update && sudo apt-get upgrade -y

  2. 为所选架构安装所需的 webkitgtk 库

    • 对于 ARMv7:sudo apt install libwebkit2gtk-4.0-dev:armhf
    • 对于 ARMv8(ARM64):sudo apt install libwebkit2gtk-4.0-dev:arm64
  3. 安装 OpenSSL 或使用供应商版本

这并不总是必需的,所以你可能想先进行操作,然后检查是否看到类似 Failed to find OpenSSL development headers 的错误。

  • 在系统范围内安装开发标头
    • 对于 ARMv7:sudo apt install libssl-dev:armhf
    • 对于 ARMv8(ARM64):sudo apt install libssl-dev:arm64
  • 或者为 OpenSSL Rust 箱启用 vendor 特性,这将影响所有使用相同次要版本的其他 Rust 依赖项。你可以通过将以下内容添加到 Cargo.toml 文件中的依赖项部分来执行此操作
openssl-sys = {version = "0.9", features = ["vendored"]}
  1. 根据你选择的架构将 PKG_CONFIG_SYSROOT_DIR 设置为相应的目录

    • 对于 ARMv7:export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/
    • 对于 ARMv8 (ARM64):export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/
  2. 为所需的 ARM 版本构建应用

  • 对于 ARMv7:cargo tauri build --target armv7-unknown-linux-gnueabihf
  • 对于 ARMv8 (ARM64):cargo tauri build --target aarch64-unknown-linux-gnu

根据你是否希望为 ARMv7 或 ARMv8 (ARM64) 交叉编译 Tauri 应用选择适当的指令集。请注意,具体步骤可能因你的 Linux 发行版和设置而异。

实验性:使用 GitHub 操作自动交叉编译

对于 GitHub 上的自动化 ARM 可执行文件构建,我们将使用 arm-runner-action,由 Paul Guyot 创建。

危险

AppImage 只能在 ARM 设备上构建。为了避免 Tauri 构建它,您可以在 src-tauri 文件夹中自定义 tauri.conf.json。调整 "targets" 数组以仅包含 ARM 设备所需的平台。例如

"目标": ["deb", "nsis", "msi", "app", "dmg", "updater"],

或者,在调用 `tauri build` 时,可以使用 `--bundles` 标志。

设置

按照 arm-runner-action 存储库 README 中的说明设置 GitHub 操作。如果你不熟悉 GitHub 操作,请先阅读 GitHub 操作指南

自定义 GitHub 操作 YAML 中的最后一步,以生成 .deb 文件,而不是 .img 文件

name: Raspberry Pi compile
on:
workflow_dispatch:

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: pguyot/arm-runner-[email protected]
with:
base_image: https://dietpi.com/downloads/images/DietPi_RPi-ARMv8-Bullseye.7z
cpu: cortex-a53
bind_mount_repository: true
image_additional_mb: 10240
optimize_image: false
commands: |
# Rust complains (rightly) that $HOME doesn't match eid home
export HOME=/root
# Workaround to CI worker being stuck on Updating crates.io index
export CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse
# Install setup prerequisites
apt-get update -y --allow-releaseinfo-change
apt-get upgrade -y
apt-get autoremove -y
apt-get install curl
curl https://sh.rustup.rs -sSf | sh -s -- -y
. "$HOME/.cargo/env"
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash
# Install framework specific packages
apt-get install -y nodejs
npm install next@latest react@latest react-dom@latest eslint-config-next@latest
# Install build tools and tauri-cli requirements
apt-get install -y libwebkit2gtk-4.0-dev build-essential wget libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
cargo install tauri-cli
# Install frontend dependencies
npm install
# Build the application
cargo tauri build
- name: Upload deb bundle
uses: actions/upload-artifact@v3
with:
name: Debian Bundle
path: ${{ github.workspace }}/target/release/bundle/deb/tauri_1.4_arm64.deb

调整 path 变量以匹配你的应用版本和名称:${{ github.workspace }}/target/release/bundle/deb/[name]_[version]_arm64.deb