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
- 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 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#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 的 资源 和 副文件 机制。
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 应用程序:
为所需的架构安装 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 上,将这些行添加到文件的底部(记住将 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 架构。
更新包信息:
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 crate 启用
vendor
功能,这将影响使用相同次要版本的所有其他 Rust 依赖项。您可以通过将此添加到Cargo.toml
文件中的 dependencies 部分来实现:
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 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
。