Skip to content

Tauri Skill

🤖 AI 接入指南:将本页链接发送给 AI,自动完成接入指导

快速信息

  • 应用类型: Tauri
  • Skill 版本: 2.0.0
  • 接入难度: ⭐⭐ (简单)
  • 预计时间: 10-30 分钟

📖 接入场景说明

根据项目类型,选择合适的接入方式:

场景适用项目特点预计时间
场景一非开源项目、私有项目手动构建上传,数据上报10 分钟
场景二开源项目GitHub Actions 自动化构建发布30 分钟

场景一:非开源项目接入

适用于私有项目或不需要 GitHub Actions 自动化部署的项目。

1. 安装插件

使用 Tauri 官方推荐的命令安装 updater 插件:

bash
npm run tauri add updater

此命令会自动:

  • 安装 @tauri-apps/plugin-updater 依赖
  • 安装 @tauri-apps/plugin-process 依赖(用于重启应用)
  • 配置必要的权限

如需手动安装,可分别执行:

bash
npm install @tauri-apps/plugin-updater
npm install @tauri-apps/plugin-process

2. 生成签名密钥

Tauri 更新需要使用签名密钥来验证更新包的完整性。您需要生成一对密钥(公钥和私钥)。

生成密钥

在项目根目录执行以下命令:

bash
npm run tauri signer generate -- -w ./.tauri/tauri.key

执行后会提示您输入密码(用于保护私钥),并生成两个文件:

  • .tauri/tauri.key - 私钥(用于签名更新包,请妥善保管,不要提交到代码仓库
  • .tauri/tauri.key.pub - 公钥(用于配置到应用中验证更新包)

查看公钥内容

bash
cat .tauri/tauri.key.pub

输出类似:

dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDY4QjBGNEM4NjUyMUNGRjAKUldUd3p5Rmx5UFN3YUN1UkFMK05DdWR4VjA1eDRybkxJNzMreURNbHZ4VFhtSk54UTVMWVg4NnAK

配置环境变量

在构建更新包时,需要设置以下环境变量:

bash
# Mac/Linux
export TAURI_SIGNING_PRIVATE_KEY=$(cat .tauri/tauri.key)
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD=您设置的密码

# Windows (PowerShell)
$env:TAURI_SIGNING_PRIVATE_KEY = Get-Content .tauri/tauri.key -Raw
$env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD = "您设置的密码"

⚠️ 安全提示

  • 私钥文件 .tauri/tauri.key 请添加到 .gitignore,不要提交到代码仓库
  • 在 CI/CD 中使用环境变量或密钥管理服务存储私钥
  • 公钥可以公开,用于配置到应用中

3. 配置 tauri.conf.json

src-tauri/tauri.conf.json 中配置更新插件:

json
{
  "bundle": {
    "createUpdaterArtifacts": true
  },
  "plugins": {
    "updater": {
      "pubkey": "您生成的公钥内容",
      "endpoints": [
        "https://api.upgrade.toolsetlink.com/v1/tauri/upgrade?tauriKey=YOUR_TAURI_KEY&versionName={{current_version}}&appointVersionName=&devModelKey=&devKey=&target={{target}}&arch={{arch}}"
      ],
      "windows": {
        "installMode": "passive"
      }
    }
  }
}

配置说明

字段说明
createUpdaterArtifacts设置为 true 告诉 Tauri 创建更新包
pubkey步骤 2 生成的公钥内容(不是文件路径)
endpointsUpgradeLink 提供的升级检测 API 地址
windows.installModeWindows 安装模式:passive(推荐)、basicUiquiet

endpoints 参数说明

参数说明来源
tauriKeyUpgradeLink 平台的应用标识UpgradeLink 后台获取
versionName当前应用版本自动填充
target操作系统自动填充
arch系统架构自动填充

⚠️ 注意

  1. 您生成的公钥内容 替换为步骤 2 中生成的公钥
  2. YOUR_TAURI_KEY 替换为您的实际 Tauri Key

4. 添加检查更新代码

在您的 Tauri 应用中添加以下代码:

typescript
import { check } from '@tauri-apps/plugin-updater';
import { relaunch } from '@tauri-apps/plugin-process';

async function checkForUpdates() {
  try {
    const update = await check({
      timeout: 5000,
      headers: {
        'X-AccessKey': 'YOUR_ACCESS_KEY',
      },
    });
    
    if (update) {
      console.log(`发现新版本 ${update.version},发布于 ${update.date}`);
      console.log(`更新说明: ${update.body}`);
      
      let downloaded = 0;
      let contentLength = 0;
      
      await update.downloadAndInstall((event) => {
        switch (event.event) {
          case 'Started':
            contentLength = event.data.contentLength;
            console.log(`开始下载,总大小: ${contentLength} bytes`);
            break;
          case 'Progress':
            downloaded += event.data.chunkLength;
            console.log(`下载进度: ${downloaded} / ${contentLength}`);
            break;
          case 'Finished':
            console.log('下载完成');
            break;
        }
      });
      
      console.log('安装完成,即将重启应用');
      await relaunch();
    } else {
      console.log('当前已是最新版本');
    }
  } catch (error) {
    console.error('检查更新失败:', error);
  }
}

⚠️ 注意:将 YOUR_ACCESS_KEY 替换为您的实际 Access Key

5. 设置权限

src-tauri/capabilities/default.json 中添加权限:

json
{
  "permissions": [
    "updater:default",
    "process:default"
  ]
}

权限说明

权限说明
updater:default允许检查、下载、安装更新
process:default允许重启应用

6. 数据上报集成

在升级流程中,调用数据上报接口记录升级状态,以便进行数据统计和分析。

上报工具函数

typescript
import crypto from 'crypto';

function generateSignature(timestamp: string, nonce: string, body: string, accessSecret: string): string {
  const signStr = `timestamp=${timestamp}&nonce=${nonce}&body=${body}&accessSecret=${accessSecret}`;
  return crypto.createHash('md5').update(signStr).digest('hex');
}

function generateNonce(length: number = 16): string {
  return crypto.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);
}

async function reportEvent(
  eventType: string,
  appKey: string,
  eventData: Record<string, any>,
  accessKey: string,
  accessSecret: string
): Promise<void> {
  const timestamp = new Date().toISOString();
  const nonce = generateNonce();
  const body = JSON.stringify({
    eventType,
    timestamp,
    appKey,
    eventData,
  });
  
  const signature = generateSignature(timestamp, nonce, body, accessSecret);
  
  try {
    const response = await fetch('https://api.upgrade.toolsetlink.com/v1/app/report', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Timestamp': timestamp,
        'X-Nonce': nonce,
        'X-AccessKey': accessKey,
        'X-Signature': signature,
      },
      body,
    });
    
    const result = await response.json();
    console.log('上报结果:', result);
  } catch (error) {
    console.error('上报失败:', error);
  }
}

完整升级流程示例(含数据上报)

typescript
import { check } from '@tauri-apps/plugin-updater';
import { relaunch } from '@tauri-apps/plugin-process';
import { getVersion } from '@tauri-apps/api/app';
import { platform, arch } from '@tauri-apps/plugin-os';

let upgradeVersionCode = 0;

async function checkAndInstallUpdate() {
  try {
    const update = await check({
      timeout: 5000,
      headers: {
        'X-AccessKey': 'YOUR_ACCESS_KEY',
      },
    });
    
    if (update) {
      console.log('发现新版本:', update.version);
      upgradeVersionCode = parseInt(update.version.split('.').join(''));
      
      let downloaded = 0;
      let contentLength = 0;
      
      await update.downloadAndInstall((event) => {
        switch (event.event) {
          case 'Started':
            contentLength = event.data.contentLength || 0;
            console.log(`开始下载,总大小: ${contentLength} bytes`);
            break;
          case 'Progress':
            downloaded += event.data.chunkLength;
            const percent = contentLength > 0 ? (downloaded / contentLength * 100).toFixed(1) : '未知';
            console.log(`下载进度: ${percent}%`);
            break;
          case 'Finished':
            console.log('下载完成');
            reportDownload(upgradeVersionCode, 0);
            break;
        }
      });
      
      console.log('安装完成,即将重启应用');
      await reportUpgrade(upgradeVersionCode, 0);
      await relaunch();
    }
  } catch (error) {
    console.error('更新失败:', error);
    
    if (upgradeVersionCode > 0) {
      await reportDownload(upgradeVersionCode, 1);
      await reportUpgrade(upgradeVersionCode, 1);
    }
  }
}

async function reportDownload(downloadVersionCode: number, code: number) {
  const currentVersion = await getVersion();
  const currentPlatform = await platform();
  const currentArch = await arch();
  
  await reportEvent(
    'app_upgrade_download',
    'YOUR_TAURI_KEY',
    {
      versionCode: parseInt(currentVersion.split('.').join('')),
      downloadVersionCode,
      code,
      target: currentPlatform,
      arch: currentArch,
    },
    'YOUR_ACCESS_KEY',
    'YOUR_ACCESS_SECRET'
  );
}

async function reportUpgrade(upgradeVersionCode: number, code: number) {
  const currentVersion = await getVersion();
  const currentPlatform = await platform();
  const currentArch = await arch();
  
  await reportEvent(
    'app_upgrade_upgrade',
    'YOUR_TAURI_KEY',
    {
      versionCode: parseInt(currentVersion.split('.').join('')),
      upgradeVersionCode,
      code,
      target: currentPlatform,
      arch: currentArch,
    },
    'YOUR_ACCESS_KEY',
    'YOUR_ACCESS_SECRET'
  );
}

async function reportAppStart() {
  const currentVersion = await getVersion();
  const currentPlatform = await platform();
  const currentArch = await arch();
  
  await reportEvent(
    'app_start',
    'YOUR_TAURI_KEY',
    {
      versionCode: parseInt(currentVersion.split('.').join('')),
      launchTime: new Date().toISOString(),
      target: currentPlatform,
      arch: currentArch,
    },
    'YOUR_ACCESS_KEY',
    'YOUR_ACCESS_SECRET'
  );
}

状态码说明

下载事件 code:

状态码说明
0下载成功
1下载失败(泛用)
1001HTTP 错误
1002空间不足
1003文件操作错误
1004MD5 校验失败

升级事件 code:

状态码说明
0升级成功
1升级失败

📖 详细接口文档事件上报接口

7. 手动构建与上传

构建更新包

设置环境变量后,执行构建命令:

bash
npm run tauri build

生成的文件

构建完成后,会在以下目录生成更新包:

平台目录文件
Linuxtarget/release/bundle/appimage/myapp.AppImagemyapp.AppImage.sig
macOStarget/release/bundle/macos/myapp.app.tar.gzmyapp.app.tar.gz.sig
Windowstarget/release/bundle/msi/myapp.msimyapp.msi.sig
Windowstarget/release/bundle/nsis/myapp-setup.exemyapp-setup.exe.sig
  1. 登录 UpgradeLink 后台
  2. 进入应用管理页面
  3. 创建新版本,上传对应的安装包和签名文件
  4. 配置升级策略

场景二:开源项目接入

适用于开源项目,需要 GitHub Actions 自动化构建、发布和更新。

1. 完成基础接入

首先完成 场景一 的所有步骤(1-6)。

2. 配置 GitHub Secrets

在 GitHub 仓库的 Settings > Security > Secrets and variables > Actions 中添加以下加密环境变量:

Secret 名称说明获取方式
UPGRADE_LINK_ACCESS_KEYUpgradeLink 访问密钥UpgradeLink 后台 > 密钥管理
UPGRADE_LINK_ACCESS_SECRETUpgradeLink 访问密钥密文UpgradeLink 后台 > 密钥管理
UPGRADE_LINK_TAURI_KEYTauri 应用唯一标识UpgradeLink 后台 > 应用信息
TAURI_SIGNING_PRIVATE_KEYTauri 签名私钥步骤 2 生成的私钥内容
TAURI_SIGNING_PRIVATE_KEY_PASSWORD签名私钥密码步骤 2 设置的密码

3. 配置 GitHub Actions 工作流

在项目根目录创建 .github/workflows/publish.yml

yaml
name: 'publish'

on:
  push:
    branches:
      - main

jobs:
  publish-tauri:
    permissions:
      contents: write
    outputs:
      appVersion: ${{ steps.set-job-output.outputs.appVersion }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: 'macos-latest'
            args: '--target aarch64-apple-darwin'
          - platform: 'macos-latest'
            args: '--target x86_64-apple-darwin'
          - platform: 'ubuntu-22.04'
            args: ''
          - platform: 'ubuntu-22.04-arm'
            args: ''
          - platform: 'windows-latest'
            args: ''

    runs-on: ${{ matrix.platform }}
    steps:
      - uses: actions/checkout@v4

      - name: install dependencies (ubuntu only)
        if: startsWith(matrix.platform, 'ubuntu-')
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf xdg-utils

      - name: setup node
        uses: actions/setup-node@v4
        with:
          node-version: lts/*
          cache: 'yarn'

      - name: install Rust stable
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

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

      - name: install frontend dependencies
        run: yarn install

      - uses: tauri-apps/tauri-action@v0
        id: tauri-action
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
        with:
          tagName: ${{ github.event.repository.name }}-v__VERSION__
          releaseName: '${{ github.event.repository.name }} v__VERSION__'
          releaseBody: 'See the assets to download this version and install.'
          releaseDraft: false
          prerelease: false
          args: ${{ matrix.args }}

      - name: Set job output
        id: set-job-output
        if: matrix.platform == 'ubuntu-22.04'
        run: |
          echo "appVersion=${{ steps.tauri-action.outputs.appVersion }}" >> $GITHUB_OUTPUT

  upgradeLink-upload:
    needs: publish-tauri
    permissions:
      contents: write
    runs-on: ubuntu-latest
    steps:
      - name: Send a request to UpgradeLink
        uses: toolsetlink/upgradelink-action@3.0.2
        with:
          access_key: ${{ secrets.UPGRADE_LINK_ACCESS_KEY }}
          access_secret: ${{ secrets.UPGRADE_LINK_ACCESS_SECRET }}
          config: |
            {
              "app_type": "tauri",
              "request": {
                "app_key": "${{ secrets.UPGRADE_LINK_TAURI_KEY }}",
                "latest_json_url": "https://github.com/${{ github.repository }}/releases/download/${{ github.event.repository.name }}-v${{ needs.publish-tauri.outputs.appVersion }}/latest.json"
              }
            }

4. 工作流详解

publish-tauri 作业

功能:跨平台构建并发布到 GitHub Releases

步骤说明
检出代码actions/checkout@v4
安装依赖Linux 系统依赖、Node.js、Rust
构建缓存Rust 编译缓存加速构建
前端依赖安装 npm/yarn 依赖
Tauri 构建使用 tauri-apps/tauri-action@v0 构建
提取版本号输出 appVersion 供后续使用

多平台构建策略

平台Runner目标架构
macOS (M1+)macos-latestaarch64-apple-darwin
macOS (Intel)macos-latestx86_64-apple-darwin
Linux (x64)ubuntu-22.04-
Linux (ARM)ubuntu-22.04-arm-
Windowswindows-latest-

功能:将更新信息同步到 UpgradeLink 平台

步骤说明
等待构建依赖 publish-tauri 完成
获取版本号publish-tauri 输出获取
上传信息使用 upgradelink-action 同步

UpgradeLink Action 参数

参数说明
access_keyUpgradeLink 访问密钥
access_secretUpgradeLink 访问密钥密文
app_type应用类型,固定为 tauri
app_keyTauri 应用唯一标识
latest_json_urlGitHub Releases 中的 latest.json 地址

在 UpgradeLink 后台配置 GitHub 仓库地址:

  1. 登录 UpgradeLink 后台
  2. 进入应用管理 > Tauri 应用详情
  3. 在「GitHub 仓库地址」字段填入仓库地址,如:https://github.com/username/repo-name
  4. 保存配置

配置后,UpgradeLink 会自动读取 GitHub Releases 中的 latest.json 文件。

6. 自动化流程说明

当代码推送到 main 分支时,自动化流程如下:

代码推送


┌─────────────────────────────────────────┐
│         publish-tauri 作业               │
│  ┌─────────────────────────────────┐    │
│  │ 并行构建 5 个平台                │    │
│  │ - macOS (M1)                    │    │
│  │ - macOS (Intel)                 │    │
│  │ - Linux (x64)                   │    │
│  │ - Linux (ARM)                   │    │
│  │ - Windows                       │    │
│  └─────────────────────────────────┘    │
│                 │                        │
│                 ▼                        │
│  ┌─────────────────────────────────┐    │
│  │ 创建 GitHub Release              │    │
│  │ 上传安装包和 latest.json         │    │
│  └─────────────────────────────────┘    │
└─────────────────────────────────────────┘


┌─────────────────────────────────────────┐
│       upgradeLink-upload 作业            │
│  ┌─────────────────────────────────┐    │
│  │ 读取 latest.json 地址            │    │
│  │ 调用 UpgradeLink API             │    │
│  │ 自动创建版本和升级策略            │    │
│  └─────────────────────────────────┘    │
└─────────────────────────────────────────┘


用户收到更新通知

🤖 AI 接入

将本页链接发送给 AI,例如:

请帮我接入应用升级,这是 Skill 链接:
https://www.toolsetlink.com/upgrade/skill/tauri

AI 将自动:

  1. 识别应用类型为 Tauri
  2. 判断项目类型(开源/非开源)
  3. 获取配置信息和示例代码
  4. 指导您替换占位符(YOUR_TAURI_KEY 等)
  5. 验证配置正确性
  6. 完成接入测试

📋 完整示例

查看完整示例项目:tauri-demo


❓ 常见问题

Q: 如何获取 Tauri Key?

A: 登录 UpgradeLink 后台,创建 Tauri 应用后获取。

Q: 如何获取 Access Key 和 Access Secret?

A: 登录 UpgradeLink 后台,在密钥管理页面获取。

Q: 更新失败怎么办?

A: 检查网络连接、配置是否正确,或联系 AI 获取帮助。

Q: 数据上报失败会影响升级流程吗?

A: 不会。数据上报是异步操作,失败不会影响正常的升级流程。建议在业务低峰期重试。

Q: GitHub Actions 构建失败怎么办?

A:

  1. 检查 GitHub Actions 日志,查看具体错误信息
  2. 确认所有依赖已正确安装,特别是 Linux 平台的系统依赖
  3. 确保 Rust 和 Node.js 版本兼容
  4. 检查 GitHub Secrets 是否配置正确

Q: 如何测试更新流程?

A:

  1. 构建并上传一个低版本
  2. 修改代码版本号,构建上传高版本
  3. 运行低版本应用,检查是否能检测到更新

Q: 可以回滚到旧版本吗?

A: 可以。在 UpgradeLink 后台修改升级策略,指定目标版本即可。


📚 参考资源