更新應用程式
有幾種方式可以為您的 Electron 應用程式提供自動更新。最簡單且官方支援的方式是利用內建的 Squirrel 框架和 Electron 的 autoUpdater 模組。
使用雲端物件儲存 (無伺服器)
對於簡單的無伺服器更新流程,Electron 的 autoUpdater 模組可以透過指向包含最新發佈版本中繼資料的靜態儲存 URL 來檢查是否有可用的更新。
當有新的發佈版本可用時,此中繼資料需要與發佈版本本身一起發佈到雲端儲存空間。中繼資料格式對於 macOS 和 Windows 來說有所不同。
發佈發佈版本中繼資料
使用 Electron Forge,您可以透過使用 macUpdateManifestBaseUrl
從 ZIP Maker (macOS) 和使用 remoteReleases
的 Squirrel.Windows Maker (Windows) 發佈中繼資料工件來設定靜態檔案儲存更新。
請參閱 Forge 的 從 S3 自動更新 指南,以取得端對端範例。
手動發佈
在 macOS 上,Squirrel.Mac 可以透過讀取具有以下 JSON 格式的 releases.json
檔案來接收更新
{
"currentRelease": "1.2.3",
"releases": [
{
"version": "1.2.1",
"updateTo": {
"version": "1.2.1",
"pub_date": "2023-09-18T12:29:53+01:00",
"notes": "Theses are some release notes innit",
"name": "1.2.1",
"url": "https://mycompany.example.com/myapp/releases/myrelease"
}
},
{
"version": "1.2.3",
"updateTo": {
"version": "1.2.3",
"pub_date": "2024-09-18T12:29:53+01:00",
"notes": "Theses are some more release notes innit",
"name": "1.2.3",
"url": "https://mycompany.example.com/myapp/releases/myrelease3"
}
}
]
}
在 Windows 上,Squirrel.Windows 可以透過讀取在建置過程中產生的 RELEASES 檔案來接收更新。此檔案詳細說明要更新到的 .nupkg
delta 套件。
B0892F3C7AC91D72A6271FF36905FEF8FE993520 electron-fiddle-0.36.3-full.nupkg 103298365
這些檔案應與您的發佈版本位於同一目錄中,且位於了解您應用程式平台和架構的資料夾結構下。
例如
my-app-updates/
├─ darwin/
│ ├─ x64/
│ │ ├─ my-app-1.0.0-darwin-x64.zip
│ │ ├─ my-app-1.1.0-darwin-x64.zip
│ │ ├─ RELEASES.json
│ ├─ arm64/
│ │ ├─ my-app-1.0.0-darwin-arm64.zip
│ │ ├─ my-app-1.1.0-darwin-arm64.zip
│ │ ├─ RELEASES.json
├─ win32/
│ ├─ x64/
│ │ ├─ my-app-1.0.0-win32-x64.exe
│ │ ├─ my-app-1.0.0-win32-x64.nupkg
│ │ ├─ my-app-1.1.0-win32-x64.exe
│ │ ├─ my-app-1.1.0-win32-x64.nupkg
│ │ ├─ RELEASES
讀取發佈版本中繼資料
最簡單的使用中繼資料方式是安裝 update-electron-app,這是一個插入式 Node.js 模組,用於設定 autoUpdater 並使用原生對話方塊提示使用者。
對於靜態儲存更新,請將 updateSource.baseUrl
參數指向包含您的發佈版本中繼資料檔案的目錄。
const { updateElectronApp, UpdateSourceType } = require('update-electron-app')
updateElectronApp({
updateSource: {
type: UpdateSourceType.StaticStorage,
baseUrl: `https://my-bucket.s3.amazonaws.com/my-app-updates/${process.platform}/${process.arch}`
}
})
使用 update.electronjs.org
Electron 團隊維護 update.electronjs.org,這是一項免費且開源的網路服務,Electron 應用程式可以使用它來進行自我更新。此服務專為符合以下條件的 Electron 應用程式設計
使用此服務最簡單的方式是安裝 update-electron-app,這是一個預先設定為與 update.electronjs.org 一起使用的 Node.js 模組。
使用您選擇的 Node.js 套件管理器安裝模組
- npm
- Yarn
npm install update-electron-app
yarn add update-electron-app
然後,從您應用程式的主要程序檔案中呼叫更新程式
require('update-electron-app')()
預設情況下,此模組會在應用程式啟動時檢查更新,然後每十分鐘檢查一次。當找到更新時,它將自動在背景中下載。當下載完成時,會顯示一個對話方塊,允許使用者重新啟動應用程式。
如果您需要自訂您的設定,您可以 將選項傳遞給 update-electron-app 或 直接使用更新服務。
使用其他更新服務
如果您正在開發私有的 Electron 應用程式,或者您沒有將發佈版本發佈到 GitHub 發佈,則可能需要執行自己的更新伺服器。
步驟 1:部署更新伺服器
根據您的需求,您可以從以下選項中選擇一個
- Hazel – 適用於私有或開源應用程式的更新伺服器,可以在 Vercel 上免費部署。它從 GitHub 發佈 中提取,並利用 GitHub CDN 的強大功能。
- Nuts – 也使用 GitHub 發佈,但在磁碟上快取應用程式更新,並支援私有儲存庫。
- electron-release-server – 提供用於處理發佈版本的儀表板,並且不要求發佈版本起源於 GitHub。
- Nucleus – 由 Atlassian 維護的 Electron 應用程式完整更新伺服器。支援多個應用程式和通道;使用靜態檔案儲存來降低伺服器成本。
部署更新伺服器後,您可以使用 Electron 的 autoUpdater 模組來檢測您的應用程式程式碼,以接收和套用更新。
步驟 2:在您的應用程式中接收更新
首先,在您的主要程序程式碼中匯入所需的模組。以下程式碼可能會因不同的伺服器軟體而有所不同,但它會像使用 Hazel 時所描述的那樣運作。
請確保以下程式碼只會在您封裝的應用程式中執行,而不會在開發中執行。您可以使用 app.isPackaged API 來檢查環境。
const { app, autoUpdater, dialog } = require('electron')
接下來,建構更新伺服器饋送的 URL,並告知 autoUpdater 這件事
const server = 'https://your-deployment-url.com'
const url = `${server}/update/${process.platform}/${app.getVersion()}`
autoUpdater.setFeedURL({ url })
最後一步,檢查更新。以下範例將每分鐘檢查一次
setInterval(() => {
autoUpdater.checkForUpdates()
}, 60000)
一旦您的應用程式被 封裝,它將接收您發佈的每個新 GitHub 發佈 的更新。
步驟 3:當有可用的更新時通知使用者
現在您已經為您的應用程式設定了基本的更新機制,您需要確保使用者在有更新時會收到通知。這可以使用 autoUpdater API 事件 來實現
autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
const dialogOpts = {
type: 'info',
buttons: ['Restart', 'Later'],
title: 'Application Update',
message: process.platform === 'win32' ? releaseNotes : releaseName,
detail:
'A new version has been downloaded. Restart the application to apply the updates.'
}
dialog.showMessageBox(dialogOpts).then((returnValue) => {
if (returnValue.response === 0) autoUpdater.quitAndInstall()
})
})
也請確保 正在處理 錯誤。以下是一個將其記錄到 stderr
的範例
autoUpdater.on('error', (message) => {
console.error('There was a problem updating the application')
console.error(message)
})
由於 autoUpdate 發出的請求不在您的直接控制之下,您可能會發現難以處理的情況(例如,如果更新伺服器位於驗證後面)。url
欄位支援 file://
通訊協定,這表示透過一些努力,您可以透過從本機目錄載入更新來繞過該程序的伺服器通訊方面。以下是如何運作的範例。
更新伺服器規格
對於進階部署需求,您也可以推出自己的 Squirrel 相容更新伺服器。例如,您可能想要進行基於百分比的推出、透過單獨的發佈通道發佈您的應用程式,或將您的更新伺服器置於驗證檢查之後。
Squirrel.Windows 和 Squirrel.Mac 用戶端需要不同的回應格式,但您可以透過根據 process.platform
的值將請求傳送到不同的端點,對這兩個平台使用單一伺服器。
const { app, autoUpdater } = require('electron')
const server = 'https://your-deployment-url.com'
// e.g. for Windows and app version 1.2.3
// https://your-deployment-url.com/update/win32/1.2.3
const url = `${server}/update/${process.platform}/${app.getVersion()}`
autoUpdater.setFeedURL({ url })
Windows
Squirrel.Windows 用戶端期望更新伺服器在您端點的 /RELEASES
子路徑傳回最新可用建置的 RELEASES
工件。
例如,如果您的饋送 URL 為 https://your-deployment-url.com/update/win32/1.2.3
,則 https://your-deployment-url.com/update/win32/1.2.3/RELEASES
端點應傳回您想要提供之版本的 RELEASES
工件內容。
B0892F3C7AC91D72A6271FF36905FEF8FE993520 https://your-static.storage/your-app-1.2.3-full.nupkg 103298365
Squirrel.Windows 會執行比較檢查,以查看目前的應用程式是否應更新到 RELEASES
中傳回的版本,因此即使沒有可用的更新,您也應傳回回應。
macOS
當有可用的更新時,Squirrel.Mac 用戶端期望在饋送 URL 的端點收到 JSON 回應。此物件具有強制性的 url
屬性,該屬性對應至應用程式更新的 ZIP 封存檔。物件中的所有其他屬性都是可選的。
{
"url": "https://your-static.storage/your-app-1.2.3-darwin.zip",
"name": "1.2.3",
"notes": "Theses are some release notes innit",
"pub_date": "2024-09-18T12:29:53+01:00"
}
如果沒有可用的更新,伺服器應返回 204 No Content
HTTP 回應。