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
- Yarn
- pnpm
- bun
- Cargo
npm run tauri build
yarn tauri build
pnpm tauri build
bunx tauri build
cargo 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#1355 和 rust-lang/rust#57497,以及 AppImage 指南 以获取更多信息。
Debian
Tauri 捆绑器生成的 Debian 软件包包含将你的应用程序运送到基于 Debian 的 Linux 发行版所需的一切,定义应用程序的图标,生成桌面文件,并指定依赖项 libwebkit2gtk-4.0-37
和 libgtk-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 应用程序
为所需的架构安装 Rust 目标
- 对于 ARMv7(32 位):
rustup target add armv7-unknown-linux-gnueabihf
- 对于 ARMv8(ARM64,64 位):
rustup target add aarch64-unknown-linux-gnu
- 对于 ARMv7(32 位):
为所选架构安装相应的链接器
- 对于 ARMv7:
sudo apt install gcc-arm-linux-gnueabihf
- 对于 ARMv8(ARM64):
sudo apt install gcc-aarch64-linux-gnu
- 对于 ARMv7:
打开或创建文件
<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"在包管理器中启用相应架构
- 对于 ARMv7:
sudo dpkg --add-architecture armhf
- 对于 ARMv8(ARM64):
sudo dpkg --add-architecture arm64
- 对于 ARMv7:
调整包源
在 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 架构。
更新包信息:
sudo apt-get update && sudo apt-get upgrade -y
。为所选架构安装所需的 webkitgtk 库
- 对于 ARMv7:
sudo apt install libwebkit2gtk-4.0-dev:armhf
- 对于 ARMv8(ARM64):
sudo apt install libwebkit2gtk-4.0-dev:arm64
- 对于 ARMv7:
安装 OpenSSL 或使用供应商版本
这并不总是必需的,所以你可能想先进行操作,然后检查是否看到类似 Failed to find OpenSSL development headers
的错误。
- 在系统范围内安装开发标头
- 对于 ARMv7:
sudo apt install libssl-dev:armhf
- 对于 ARMv8(ARM64):
sudo apt install libssl-dev:arm64
- 对于 ARMv7:
- 或者为 OpenSSL Rust 箱启用
vendor
特性,这将影响所有使用相同次要版本的其他 Rust 依赖项。你可以通过将以下内容添加到Cargo.toml
文件中的依赖项部分来执行此操作
openssl-sys = {version = "0.9", features = ["vendored"]}
根据你选择的架构将
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/
- 对于 ARMv7:
为所需的 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
。