Linux打包
适用于 Linux 的 Tauri 应用程序可通过 Debian 打包程序(.deb
文件)或 AppImage(.AppImage
文件)发布。Tauri CLI 默认以这些格式自动打包应用程序代码。请注意,.deb
和 .AppImage
打包文件只能在 Linux 上创建,因为交叉编译还不能使用。
macOS 和 Linux 上的图形用户界面应用程序不会从 shell 点文件(.bashrc
、.bash_profile
、.zshrc
等)中继承 $PATH
。查看 Tauri 的 fix-path-env-rs即可修复这一问题。
要将 Tauri 应用程序编译并打包到一个可执行文件中,只需运行以下命令即可:
- npm
- Yarn
- pnpm
- Cargo
npm run tauri build
yarn tauri build
pnpm 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
中提供文件或文件夹列表。相对于 tauri.conf.json
文件,配置对象会将 Debian 软件包中的路径映射到文件系统中的文件路径。下面是一个配置示例:
{
"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
)。
AppImages 非常方便,如果你不能使用发行版的软件包管理器制作软件包,它可以简化发行过程。不过,当文件大小从 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 自动交叉编译。
手动编译
手动编译适用于不需要经常编译应用程序,只需一次性设置的情况。请按照以下步骤操作:
前提条件
ARM 设备不支持 AppImage。为避免 Tauri 构建它,需要自定义 src-tauri 文件夹中的 tauri.conf.json。调整 "target "数组,使其仅包含 ARM 设备所需的平台。例如:
"targets": ["deb", "nsis", "msi", "app", "dmg", "updater"],
- 对于 Windows,请使用 wsl 安装指南在 WSL 上安装 Debian。
- 在 Linux 上,构建机器要求 GLIBC 版本等于或早于目标设备。请使用:
ldd --version
进行检查。 - 本指南使用基于 Debian/Ubuntu 的 Linux 发行版,因为所显示的命令使用了
apt
软件包管理器,并已在 Debian 11 上进行了测试。
交叉编译
现在,让我们交叉编译 ARM 的 Tauri 应用程序:
-
为所需架构安装 Rust 目标:
- 对于ARMv7 (32-bit):
rustup target add armv7-unknown-linux-gnueabihf
- 对于ARMv8 (ARM64, 64-bit):
rustup target add aarch64-unknown-linux-gnu
- 对于ARMv7 (32-bit):
-
为所选架构安装相应的链接器:
- 对于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 的完整示例文件
完成这些更改后,重新运行步骤 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
"(查找 OpenSSL 开发头失败)这样的错误。
- 要么在全系统范围内安装开发头文件:
- 对于ARMv7:
sudo apt install libssl-dev-dev:armhf
- 对于ARMv8 (ARM64):
sudo apt install libssl-dev-dev:arm64
- 对于ARMv7:
- 或者为 OpenSSL Rust crate 启用
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 可执行文件自动构建,我们将使用 Paul Guyot 创建的 arm-runner-action。
ARM 设备不支持 AppImage。为避免 Tauri 构建它,需要自定义 src-tauri
文件夹中的 tauri.conf.json
。调整 "target "
数组,使其仅包含 ARM 设备所需的平台。例如
"targets": ["deb", "nsis", "msi", "app", "dmg", "updater"],
设置
按照 arm-runner-action 仓库 README 中的说明设置 GitHub Action。如果你是 GitHub 动作的新手,请先阅读 GitHub Action指南。
自定义 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-action@v2.5.2
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
.