
圖說:透明可攜包、引導安裝與管理部署各自服務不同使用者
昨天談 Windows CI,今天就來看 CI 最後要交給使用者的三種發行檔:ZIP、EXE 安裝程式與 MSI。
我曾把 ZIP 按鈕寫成「可攜版」,後來自己產生疑問:墨寒確實不需要安裝,只有第一次使用的設定精靈,這樣就能叫可攜版嗎?
更準確的名稱是「ZIP 免安裝版」。解壓縮後直接執行,不代表所有個人資料都自動放在程式資料夾裡、可以插著隨身碟到處跑。名稱若讓人誤會資料完全隨程式攜帶,反而不誠實。
ZIP 免安裝版適合想直接解壓、查看內容或不想改動系統安裝清單的人。它包含主程式、_internal 與 assets 等必要資料,整個資料夾要一起保留。
常見錯誤是只把裡面的 EXE 拉到桌面,其他檔案留在原處,結果程式找不到資源。ZIP 的自由度高,也要求下載者理解「免安裝不等於只有一個檔」。
首次啟動精靈仍會出現,因為那是在建立使用者設定,不是安裝系統元件。個人資料預設放在 Windows 應用程式資料位置,需要搬家時使用 .mohan-profile,而不是直接複製一個 EXE。
EXE 安裝程式提供較熟悉的 Windows 流程:選擇語言、安裝位置、建立捷徑,之後也能從系統解除安裝。它沒有讓墨寒變成不同產品,只是替一般下載者把資料夾放置與入口整理好。
公開 RC3 的應用程式曾支援繁中、英文與簡中首次啟動,但 EXE 安裝介面最初只有繁中與英文,這個落差在發行後才被我看到。現在的 v2.1.0-rc.1 已把繁中、英文、簡中與日文一起納入互動式 EXE 安裝流程,並換上墨寒專用圖像、較大的文字與正式商業軟體風格的引導畫面。
這也是版本說明重要的原因。GitHub main、標籤與使用者已下載的安裝包,是三個不同時間點。
MSI 常用於企業或管理工具部署,支援標準化的安裝、修復與靜默參數。對一般使用者,它未必比 EXE 更友善;提供它主要是讓 Windows 管理環境有一致格式。
MSI 仍維持台灣繁中基底,但 v2.1.0-rc.1 已隨 Release 提供英文、簡中與日文 MST 語言轉換檔。它們替同一份 MSI 套用不同安裝介面文字,避免維護四個內容容易分岔的 MSI 主體。
策略文件定義語言代碼、可翻譯表格、檔名與 CI 驗證方式;發行流程也會驗證 MST 能套用並保持 MSI 主體一致。不同國家 Windows 管理環境的安裝、修復、升級與解除安裝仍需要更多真實部署回報,不能只因檔案已產生就宣稱所有企業環境都完成驗證。
原始碼測試通過,不代表封裝一定能啟動。發行流程要在乾淨環境對封裝程式執行自我檢查與事件迴圈冒煙測試;EXE 與 MSI 還要驗證靜默安裝、啟動與解除安裝,確保沒有只在開發資料夾存在的檔案依賴。
ZIP 則要完整解壓後測,不能直接在壓縮檔內執行。三種包裝的 SHA256 也要列在下載頁,讓使用者核對檔案是否與 Release 一致。
尚未數位簽署的開源預覽版可能觸發 SmartScreen。這不等於一定有病毒,也不能因此叫使用者無條件略過警告;正確做法是確認 GitHub 官方 Release、檔名與雜湊,再決定是否執行。
使用者更新或重裝程式時,個人設定、記憶與任務應保留;解除安裝若要刪除私人資料,必須另外明確詢問,不能把程式檔與使用者內容當成同一包。
反過來,安裝程式也不能把開發者自己的設定、API 金鑰或資料庫封裝進去。發行前的公開內容稽核與乾淨設定測試,就是要確保每位下載者從自己的首次啟動開始,而不是意外拿到作者電腦的一部分。
更新還要處理舊版程式檔。檔案正在使用、捷徑已存在、安裝位置含空白或非英文文字,都可能讓只在理想環境成功的安裝器失敗。EXE 和 MSI 因部署方式不同,兩邊都要各自驗證升級與移除,不能互相借用結果。
安裝介面的四語支援只負責安裝階段;進入墨寒後,仍由應用程式自己的語言設定接手。兩者要一致,卻是兩套必須分別驗證的畫面。
網站上的主要按鈕應直接寫「下載 ZIP 免安裝版」,英文可以使用「Download ZIP — no installation」。EXE 則明確稱安裝程式,MSI 標示為管理部署選項。名稱先回答使用方式,不用「候選版」、「可攜」等容易混淆的詞增加負擔。
同一頁不需要在頁首、作品介紹與下載區重複四、五個相同按鈕。重要行動可以在適當位置再提醒一次,但不該讓讀者覺得到處都是宣傳。這也是我整理官網時實際做過的取捨。
明天 Day 26,我會接著談發行檔上傳 GitHub 之後還少了什麼。v2.1.0-rc.1 為什麼需要 SHA256、完整清單、SBOM、更新資訊、Gitleaks 與 Artifact Attestation?一個下載連結要如何成為可驗證的發布?
本文保留 RC3 的歷史落差,也補上 v2.1.0-rc.1 已完成的四語 EXE 與 MSI 語言轉換檔;下載時仍請以 GitHub Release 的標籤、檔名與版本說明為準。