跳到主要内容

Linux 软件包

面向 Linux 的 Tauri 应用程序通过 Debian 软件包(.deb 文件)或 AppImage(.AppImage 文件)进行分发。Tauri CLI 默认情况下会自动将您的应用程序代码打包成这些格式。请注意,.deb.AppImage 软件包**只能在 Linux 上创建**,因为跨编译尚不可用。

注意

macOS 和 Linux 上的 GUI 应用不会继承 shell 配置文件(.bashrc.bash_profile.zshrc 等)中的 $PATH。查看 Tauri 的 fix-path-env-rs crate 来解决这个问题。

要将您的 Tauri 应用程序构建并打包成单个可执行文件,只需运行以下命令:

npm run tauri build

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

限制

诸如 glibc 之类的核心库经常会破坏与旧系统的兼容性。因此,您必须使用您打算支持的最旧的基础系统来构建 Tauri 应用程序。与 Ubuntu 22.04 相比,Ubuntu 18.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 的 资源副文件 机制。

AppImage

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

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

警告

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

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

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

手动编译

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

先决条件

危险

ARM AppImage 只能在 ARM 设备上构建。为了防止 Tauri 在交叉编译时构建它,您可以在 src-tauri 文件夹中自定义 tauri.conf.json。调整“targets”数组,使其仅包含基于 ARM 的设备所需平台。例如:

"targets"["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 上,将这些行添加到文件的底部(记住将 jammy 替换为您 Ubuntu 版本的代号):

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 crate 启用 vendor 功能,这将影响使用相同次要版本的所有其他 Rust 依赖项。您可以通过将此添加到 Cargo.toml 文件中的 dependencies 部分来实现:
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 Action 进行自动交叉编译

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

危险

ARM AppImage 只能在 ARM 设备上构建。为了防止 Tauri 在交叉编译时构建它,您可以在 src-tauri 文件夹中自定义 tauri.conf.json。调整“targets”数组,使其仅包含基于 ARM 的设备所需平台。例如:

"targets"["deb", "nsis", "msi", "app", "dmg", "updater"],

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

设置

按照arm-runner-action 代码库 的 README 中的说明设置 GitHub Action。如果您不熟悉 GitHub Actions,请先阅读GitHub Actions 指南

自定义 GitHub Action 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.img.xz
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