Tauri 2.0 桌面端自动更新方案

7 阅读4分钟

前言

最近在研究 Tauri 2.0 如何自动更新,跟着官网教程来了一遍,发现并不顺利,踩了很多坑,不过好在最后终于走通了,今天整理一下供大家参考。

第一步

自动更新利用的是 Tauri 的 Updater 组件,所以这里需要安装一下:

PNPM 执行这个(笔者用的 PNPM):

pnpm tauri add updater

NPM 执行这个:

npm run tauri add updater

接着在 /src-tauri/tauri.conf.json 文件中添加以下配置:

{
  "bundle": {
    "createUpdaterArtifacts": true
  },
  "plugins": {
    "updater": {
      "pubkey": "你的公钥",
      "endpoints": ["https://releases.myapp.com/latest.json"]
    }
  }
}

其中:

  • createUpdaterArtifacts 为是否创建更新包,设置为 true 即可。根据官网介绍,未来发布的 V3 版本将无需设置。

  • pubkey 是公钥,用于和私钥匹配(私钥在开发环境配置,并在打包时自动携带)。但此时我们还没有,所以需要生成一下,执行以下命令生成密钥对:

    PNPM 执行这个:

    pnpm tauri signer generate -w ~/.tauri/myapp.key
    

    NPM 执行这个:

    npm run tauri signer generate -- -w ~/.tauri/myapp.key
    

    执行时会要求输入一个密码用来保护密钥,也可以直接按回车跳过,建议还是输入一个:

    image.png

    输入(或跳过)之后,将会继续生成,生成之后进入刚才我们指定的目录 ~/.tauri

    image.png

    打开公钥 myapp.key.pub 然后将上面的 pubkey 替换掉。

    私钥的话,打开 myapp.key 然后执行以下方法设置到环境变量:

    macOS 和 Linux 执行这个(笔者是 macOS):

    export TAURI_SIGNING_PRIVATE_KEY="你的私钥"
    export TAURI_SIGNING_PRIVATE_KEY_PASSWORD="你刚才输入的密码,没有就不用设置。"
    

    Windows 使用 Powershell 执行这个:

    $env:TAURI_SIGNING_PRIVATE_KEY="你的私钥"
    $env:TAURI_SIGNING_PRIVATE_KEY_PASSWORD="你刚才输入的密码,没有就不用设置。"
    
  • endpoints 用于 Tauri 检查更新,是一个数组,所以可以设置多个,将会依次尝试可用的 URL,URL 指向放置在服务器的用于存储版本信息的 JSON 文件(也可以使用 API 的形式,这里不介绍了),格式如下:

    {
      "version": "1.0.1",
      "notes": "更新说明",
      "pub_date": "2025-05-21T03:29:28.626Z",
      "platforms": {
        "darwin-aarch64": {
          "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTU0xJb2k1U3J6ZVFoUWo3R2lMTm5EdzhoNUZTKzdsY0g1NktOOTFNL2RMM0JVVVl4b0k3bFB0MkhyL3pKOHRYZ0x0RVdUYzdyWVJvNDBtRDM0OGtZa2d0RWl0VTBqSndrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzQ3Nzk1MTY5CWZpbGU6bXktdGF1cmktYXBwLmFwcC50YXIuZ3oKS1N0UDl5MHRteUd0RHJ6anlSMXBSWmNJUlNKb1pYTDFvK2EvUjArTlBpbXVGN3pnQlA0THhhVUd4S3JrZy9lNHBNbWVSU2VoaCswN25xNEFPcmtUQnc9PQo=",
          "url": "macOS 包下载地址"
        }
      }
    }
    

    将此 JSON 文件放置在服务器,然后将上面的 endpoints 数组里的地址替换为这个 JSON 的真实地址。

    其中:

    • version 是版本号,升级时需要大于当前用户使用的版本。

    • notes 是更新说明,可以向用户说明本次更新的内容。

    • pub_date 是更新日期,非必填。

    • platform 是更新的平台,这里我以 macOS 为例,Windows 同理。

    • signature 是每次打包后的签名,所以每次都不一样,macOS 默认在 /src-tauri/target/release/bundle/macos/my-tauri-app.app.tar.gz.sig 这个位置,将这个文件打开,复制里面的内容替换即可。

第二步

配置好以后,就可以在应用内调用 check 方法进行更新了,比如在用户每次应用启动后。以下是从检查更新到更新完成的全流程的必要代码:

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

const fetchVersion = async () => {
  const update = await check()

  if (update) {
    console.log(`found update ${update.version} from ${update.date} with notes ${update.body}`)
    let downloaded = 0
    let contentLength = 0
    // 也可以分开调用 update.download() 和 update.install()
    await update.downloadAndInstall(event => {
      switch (event.event) {
        case 'Started':
          contentLength = event.data.contentLength
          console.log(`started downloading ${event.data.contentLength} bytes`)
          break
        case 'Progress':
          downloaded += event.data.chunkLength
          console.log(`downloaded ${downloaded} from ${contentLength}`)
          break
        case 'Finished':
          console.log('download finished')
          break
      }
    })

    console.log('update installed')
    // 此处 relaunch 前最好询问用户
    await relaunch()
  }
}

代码已经很简洁了,相信大家能看懂,但还是简单说一下:

首先调用 check 方法。检查之后,check 方法会返回一个 update 对象,如果检查到有更新,该对象会包含上面的版本更新信息,也包含一个 downloadAndInstall 方法。

执行 downloadAndInstall 方法,该方法执行完之后就代表安装成功了,会在下次启动时更新为新版本。当然也可以立即生效,只需要调用 relaunch 方法重启应用即可,但重启前最好提醒用户

源码(经测试已经成功实现自动更新)已经上传到 Github:github.com/reallimengz…