跨平台编译

Tauri 严重依赖本地库和工具链,因此目前无法进行有意义的交叉编译。下一个最佳选择是利用托管在 GitHub Actions、Azure Pipelines、GitLab 或其他选项上的 CI/CD 管道进行编译。管道可以同时运行每个平台的编译,使编译和发布过程变得更加简单。

为了方便设置,我们目前提供了 Tauri Action,这是一个可在所有支持平台上运行的 GitHub Action,可编译软件、生成必要的工件,并将其上传到新的 GitHub 发布。

Tauri GitHub Action

Tauri Action 利用 GitHub Actions 同时将应用程序构建为适用于 macOS、Linux 和 Windows 的 Tauri 原生二进制文件,并自动创建 GitHub 发布。

该 GitHub Action 也可用作您的 Tauri 应用程序的测试管道,即使您不想创建新版本,也能保证发送的每个拉取请求都能在所有平台上正常编译运行。

代码签名

要在工作流程中为 Windows 和 macOS 设置代码签名,请遵循每个平台的特定指南:

入门

要设置 Tauri 操作,必须先设置一个 GitHub 仓库。您可以在未配置 Tauri 的版本库中使用此操作,因为它会在构建和配置 Tauri 之前自动初始化 Tauri,以便使用您的工件。

进入 GitHub 项目的 "操作 "选项卡,选择 "新建工作流程",然后选择 "自行设置工作流程"。用 Tauri Action 生产构建工作流程示例替换文件。或者,你也可以根据本页底部的示例设置工作流程

配置

你可以使用 configPathdistPathiconPath 选项配置Tauri。详见操作自述。

如果应用程序不在软件源的根目录下,请使用 projectPath 输入。

你可以修改工作流程名称,更改触发器,并添加更多步骤,如 npm run lintnpm run test。最重要的是在工作流程末尾保留下面一行,因为这一行会运行构建脚本并发布工件:


- uses: tauri-apps/tauri-action@v0

如何触发

上面链接的 README 示例中的发布工作流程是由 "release "分支上的推送触发的。该操作使用 tauri.config.json 中指定的应用程序版本自动为 GitHub 发布创建标签和标题。

您也可以在推送版本标签(如 "app-v0.7.0")时触发工作流程。为此,您可以更改发布工作流程的起始时间:


name: publish
on:
  push:
    tags:
      - 'app-v*'
  workflow_dispatch:

工作流程示例

下面是一个工作流程示例,每次在 git 上创建新版本时都会运行该流程。

此工作流程在 Windows、Ubuntu 和 macOS 最新版本上设置环境。请注意 jobs.release.strategy.matrix 下的平台数组,其中包含 macos-latestubuntu-20.04windows-latest

该工作流程的步骤是

  1. 使用 actions/checkout@v4 检出版本库
  2. 使用 actions/setup-node@v4 设置 Node LTS 和全局 npm/yarn/pnpm 软件包数据缓存。
  3. 使用 dtolnay/rust-toolchain@stableswatinem/rust-cache@v2target/ 文件夹设置 Rust 和缓存。
  4. 安装所有依赖项并运行构建脚本(针对网络应用)。
  5. 最后,它使用 tauri-apps/tauri-action@v0 运行 tauri build、生成工件并创建 GitHub 发布。

name: Release
on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:

jobs:
  release:
    permissions:
      contents: write
    strategy:
      fail-fast: false
      matrix:
        platform: [macos-latest, ubuntu-20.04, windows-latest]
    runs-on: ${{ matrix.platform }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install dependencies (ubuntu only)
        if: matrix.platform == 'ubuntu-20.04'
        # You can remove libayatana-appindicator3-dev if you don't use the system tray feature.
        run: |
          sudo apt-get update
          sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev

      - name: Rust setup
        uses: dtolnay/rust-toolchain@stable

      - name: Rust cache
        uses: swatinem/rust-cache@v2
        with:
          workspaces: './src-tauri -> target'

      - name: Sync node version and setup cache
        uses: actions/setup-node@v4
        with:
          node-version: 'lts/*'
          cache: 'yarn' # Set this to npm, yarn or pnpm.

      - name: Install frontend dependencies
        # If you don't have `beforeBuildCommand` configured you may want to build your frontend here too.
        run: yarn install # Change this to npm, yarn or pnpm.

      - name: Build the app
        uses: tauri-apps/tauri-action@v0

        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tagName: ${{ github.ref_name }} # This only works if your workflow triggers on new tags.
          releaseName: 'App Name v__VERSION__' # tauri-action replaces \_\_VERSION\_\_ with the app version.
          releaseBody: 'See the assets to download and install this version.'
          releaseDraft: true
          prerelease: false

GitHub 环境令牌

每次运行工作流时,GitHub 都会自动发放 GitHub 令牌,无需进一步配置,这意味着不会有泄密风险。不过,该令牌默认只有读取权限,运行工作流时可能会出现 "Resource not access by integration"(集成无法访问资源)错误。如果出现这种情况,您可能需要为该令牌添加写入权限。为此,请进入 GitHub 项目设置,然后选择 "操作",向下滚动到 "工作流权限",选中 "读写权限"。

您可以在下面看到 GitHub 令牌被传递到工作流:


env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

使用说明

请务必查看 GitHub Actions 文档,以便更好地了解该工作流程的工作原理。请仔细阅读 GitHub 动作的使用限制、计费和管理文档。有些项目模板可能已经实现了 GitHub 行动工作流程,例如 tauri-svelte-template。你可以在没有配置Tauri的 repo 上使用该操作。在构建和配置之前,Tauri 会自动初始化,以使用你的网络工件。

实验:在 Linux 和 macOS 上构建 Windows 应用程序

Tauri v1.3 添加了一种基于 NSIS 安装程序框架的新 Windows 安装程序类型。与 WiX 不同的是,NSIS 本身也可以在 Linux 和 macOS 上运行,这使得在非 Windows 主机上构建许多 Tauri 应用程序成为可能。需要注意的是,这目前被认为是高度实验性的,可能无法在每个系统或每个项目上运行。因此,只有在本地虚拟机或 CI 解决方案(如 GitHub Actions)不适合您的情况下,才可将其作为最后手段使用。请注意,目前还不支持签署跨平台构建。

由于 Tauri 官方只支持 MSVC Windows 目标机,因此设置工作比较繁琐。

首先,确保所有 Tauri 依赖项都至少是 1.3 版本,如果不确定如何更新,请查看依赖项更新指南

安装NSIS

有些 Linux 发行版的软件源中有 NSIS,例如在 Ubuntu 上,运行此命令即可安装 NSIS:

Ubuntu

sudo apt install nsis

但在许多其他发行版上,你必须自己编译 NSIS 或手动下载未包含在发行版二进制包中的存根和插件。例如,Fedora 只提供二进制包,而不提供存根和插件:

Fedora

sudo dnf in mingw64-nsis
wget https://github.com/tauri-apps/binary-releases/releases/download/nsis-3/nsis-3.zip
unzip nsis-3.zip
sudo cp nsis-3.08/Stubs/* /usr/share/nsis/Stubs/
sudo cp -r nsis-3.08/Plugins/** /usr/share/nsis/Plugins/

在 macOS 上,您需要使用 Homebrew 来安装 NSIS:

macOS

brew install nsis

安装 LLVM 和 LLD 链接器

由于默认的微软链接器仅适用于 Windows,因此我们还需要安装一个新的链接器。要编译用于设置应用程序图标等的 Windows 资源文件,我们还需要 LLVM 项目中的 llvm-rc 二进制文件。

Ubuntu

sudo apt install lld llvm

macOS

brew install llvm

在 macOS 上,还必须按照安装输出中的建议,将 /opt/homebrew/opt/llvm/bin 添加到 $PATH 中。

安装 Windows Rust 目标

假设您为 64 位 Windows 系统构建:


rustup target add x86_64-pc-windows-msvc

安装Windows SDKs

为了获取 msvc 目标所需的 Windows SDK,我们将使用 xwin 项目:


cargo install xwin

然后,你可以使用 xwin CLI 将所需文件安装到你选择的位置。记住这个位置,下一步我们就需要它了。在本指南中,我们将在主目录下创建一个 .xwin 目录。


xwin splat --output ~/.xwin

如果失败,会出现类似这样的错误信息:


Error: failed to splat Microsoft.VC.14.29.16.10.CRT.x64.Desktop.base.vsix

Caused by:
    0: unable to symlink from .xwin/crt/lib/x86_64/LIBCMT.lib to libcmt.lib
    1: File exists (os error 17)

你可以尝试在命令中添加 --disable-symlinks 标记:


xwin splat --output ~/.xwin --disable-symlinks

现在,要让 Rust 编译器使用这些文件,首先要在项目中创建一个 .cargo 目录,并在其中创建一个 config.toml 文件,内容如下。确保相应更改路径。

.cargo/config.toml

[target.x86_64-pc-windows-msvc]
linker = "lld"
rustflags = [
  "-Lnative=/home/username/.xwin/crt/lib/x86_64",
  "-Lnative=/home/username/.xwin/sdk/lib/um/x86_64",
  "-Lnative=/home/username/.xwin/sdk/lib/ucrt/x86_64"
]

请注意,该文件只针对您的机器,因此如果您的项目是公共项目或将与他人共享,我们不建议将其检入 git。

构建应用程序

说明

如果您的应用程序依赖于 ringlibsqlite3-sys 等 C 语言库,跨平台构建应用程序就会变得有点棘手,因为您还需要设置适当的环境变量和软件包,以便在系统上交叉编译这些 C 语言库。这可能包括设置 CCCXXAR 和其他环境变量,不过这在很大程度上取决于构建环境的设置。有关交叉编译所需的其他配置的详细信息,请参阅所用库的文档。

现在,只需将目标添加到 tauri 编译命令即可:

  • npm
  • Yarn
  • pnpm
  • Cargo

npm run tauri build -- --target x86_64-pc-windows-msvc

yarn tauri build --target x86_64-pc-windows-msvc

pnpm tauri build --target x86_64-pc-windows-msvc

cargo tauri build --target x86_64-pc-windows-msvc

然后,编译输出将位于 target/x86_64-pc-windows-msvc/release/bundle/nsis/ 中。