最近的一個預開發任務,需要實現Electron APP 的更新策略
這里有兩種更新,
首先說下全量更新,
檢測到新版本后從服務器拉取 electron-builder生成的APP.zip文件,解壓后,把*.app/*.exe 覆蓋現有文件后重啟(Mac端)/重新安裝(PC端)。
這種更新的文件比較大,相當於刪掉舊的,重新下載新APP后運行,對於小更新如文案,圖片修改,並不友好。
electron builder 提供了這種更新方式,叫electron-updater
官方文檔如下:https://www.electron.build/auto-update
該文檔介紹的不夠詳細,使用中有很多問題都是參考github上的issue解決的
這里記錄1個問題,花了我2天多時間才搞定。
就是在執行"appUpdater.downloadUpdate()"方法時, 並沒有觸發 "download-process" 事件,
這樣就沒法在頁面上顯示下載的進度條,網速等信息。最后通過網上下載某個更新示例才得到啟發,
原來需要在下載之前,使用fs-extra.emptyDir清空緩存中的上次下載的更新文件,這樣"download-process"事件就可以完美觸發了
我的操作是在每次開啟App的時候清空這個緩存路徑
Mac/PC一套代碼就可搞定,還是很方便的
官網文檔根本就沒有提到過這個刪除緩存的操作
其次一個問題,產品的需求,要求下載過程中有"取消下載"的操作,
文檔中也沒有詳細說明,只有一個cancellationToken.
這個很快就找到了答案:https://github.com/electron-userland/electron-builder/issues/1150
需要說明的是,取消下載后,再次點擊下載,需要重新實例化 cancellationToken這個變量
----------------------------------------------------------------------
另一個是增量更新,
也叫熱更新,檢測到新版本后,從服務器拉取新版本指定的更新文件(如圖片,模版頁面,靜態html等),
在自己的服務器添加一個json文件,指定熱更新版本,熱更新所需的文件列表以及更新描述,
下載文件后替換到APP對應的文件中,然后重新載入/刷新APP。
這種方式適合小更新,但不試用后台邏輯大調整等較多的邏輯修改。
在開發過程中遇到了一個問題
如果打包時設置asar: false,在運行主進程時是可以進行文件操作, 並替換成功的。之后relaunch app就可以。
但是當設置asar: true是,運行主進程里的文件操作命令,是無法寫入修改asar里的文件的,
這個問題卡了我一天多,
最后終於找到了解決方法:這種方式需要將打包的靜態文件剝離出來,
在asar: true的情況下,要使用asar.unpack 設置未來更新時可能需要的替換文件。
建議不要暴露主進程文件,只把圖片,前端頁面放入asar.unpack.
如圖:
這樣打包后的app里就會多一個app.asar.unpacked
主進程文件放在asar里,但是在運行下文件修改命令時,修改的是asar.unpacked里的文件,這樣就可以替換成功了。
問題得到了解決,
下一步就是設置文件循環替換的promise邏輯和更新進度條。
或者下載一個包。解壓后替換。