Electron 是一個方便的跨平台桌面程式開發架構,透過 JavaScript, Bootstrap, CSS 就可以快速打包一套在多個作業系統上運行的自適應(Adaptive) 使用者介面。但我一直有個每次都會困擾很久的技術問題, Electron 釋出的 APP 如何管理與持續維護。
先聊聊 Electron 內部的更新技術套件- electron-updater – npm (npmjs.com)
electron-updater 是 Electron 提供的自動更新技術,不僅僅可以提供在 Linux, Windows 與 Mac 均能實踐,這無疑是這類型跨平台桌面應用程式開發的利器。但我們也仔細看一下針對這3者更新機制對於其安裝檔的需求差異,眼尖的你應該也很快就發現:
- macOS (Squirrel.Mac).
- Windows (NSIS).
- Linux (AppImage).
我們先談最常見的 Squirrel 與 NSIS ,這其實是兩者有點差異的技術,怎麼說呢? 我想就蹭一下最近很夯的 ChatGPT
Eidolon: Squirrel 與 NSIS 差異?
ChatGPT:
Squirrel 是一個輕量級的 C ++ 語言,用於開發和編譯跨平台的應用程序。它提供了一個功能強大的語言,可以用於構建複雜的應用程序,並支持多種編程模型,如面向對象編程,函數編程和面向過程編程。
NSIS 是一個開源的軟件安裝系統,用於創建跨平台的安裝程序。它使用一個模塊化的腳本語言,可以用來創建複雜的安裝程序,並支持多種操作系統,包括 Windows、Linux 和 Mac OS X。它也支持多種編程模型,如面向對象編程、函數編程和條件編程。
Eidolon: Squirrel 與 NSIS 何者使用最為廣泛?
ChatGPT:
NSIS 是一個自由開源的軟體安裝系統,它是一個用於創建安裝程序的框架,可以讓開發人員輕鬆地創建具有複雜功能的安裝程序。NSIS 已經被許多公司和開發人員使用,包括Mozilla、Skype、Google Chrome 和 iTunes 等。
Squirrel 是一個開源的軟體安裝器,它是一個用於創建安裝程序的框架,它可以讓開發人員輕鬆地創建具有複雜功能的安裝程序。Squirrel 已經被許多公司和開發人員使用,但它並不像NSIS那樣廣泛使用。
上面的內容是 ChatGPT 的回覆,就我自己的使用經驗也確實如此, NSIS 的打包形式確實比較貼近我們常取得的應用程式安裝介面。你可以定義很多參數,顯示比較多的畫面資訊供使用者調整與設定安裝路徑與相關版權宣告等資訊。
稍微有點概念後,我們一定會希望在版本推進過程當中有一個網頁與資料庫可以協助我們管理這麼多的安裝檔案與版本發布歷程。
GitHub – ArekSredzki/electron-release-server: A fully featured, self-hosted release server for electron applications, compatible with auto-updater.
Electron Release Server 這款就是 Electron 推薦的平台之一,他也是其中維護與使用者人數最多的專案。他可以做到使用者管理與版本發布控管,但他有幾大小問題,也是我追蹤好一陣子最後還是棄用的關鍵
- NSIS 只支援單一套件。換言之,如果你有多個APP發布的話,因為 endpoint 關係你需要起多個相同專案,因為每個專案只能有一個 NSIS APP。
- Squirrel 支援多個套件(Favor)與版本(Alpha, Beta, Release)管理,但尷尬的是Electron在原生自動更新程式中在Windows只支持NSIS。
畢竟這套工具還是有不少的優點,漂亮的介面與完善的管理。這些問題不是不能克服,甚至你也可以轉為優勢,這些部份我們可以留在日後分享我的解決策略…
我現在好像就遇到進退兩難的狀況
主要是 Electron Forge 與 Electron Builder 的派系之爭(?
1. Forge:設定好之後,從打包到發布只要一個指令,我用 Electron Release Server 也很順利
但……一直沒辦法成功 checkForUpdate,不知道是不是設定的更新端點有誤
另外就是,整個 publish 完成的時間真的太久了
2. Builder:目前我唯一的感覺是編譯過程快多了,NSIS的安裝檔案也比Squirrel小了20多MB
但……要自己用只能用一個檔案伺服器,也沒有管理UI可用,也不能像ERS那樣自動上傳功能
不曉得後來有研究出甚麼策略嗎?或者有沒有甚麼建議可以讓我參考
萬分感謝^^
Electron Release Server 在部署上其實也是滿滿的坑,後來我是使用 Github 的專案加上 docker 技術來解決 checkForUpdate 沒法取得軟體資訊的坑。如果你也是使用 dockerhub 來跑的話,估計就是遇到這個問題。我自己追蹤代碼是發現疑似版本汰舊的問題,很多功能都是有問題的,特別是 api 的部分,他是無法順利取得版本資訊的。
編譯部分,我是使用 electron-builder 來處理 Windows 的安裝程式發布,目前確認是可行的。可是如果你要用在 macOS 上,就沒法搭著 electron release server 來玩,我也在評估是不是自己架一個檔案伺服器跟一些後台管理的機制完善跨平台的軟體更新發布功能。
順帶一提,台灣好像滿少這方面的資源,很多資料都來自CSDN。難得遇上一起經歷這個坑的同道人,歡迎一起交流。