本文由網友投稿,.NET 是免費、開源、跨平台的。
作者:傲慢與偏見
原文標題:利用 Inno Setup 在 VS 編譯時自動構建安裝包
原文連結:https://www.cnblogs.com/chonglu/p/17566940.html
歡迎網友們投稿技術類文章,題材不限,沒有稿費...

1. 摘要
很多 C/S 開發領域的同學或多或少都可能會遇到需要製作安裝包的場景,打包的工具也是五花八門,例如有 NSIS、InstallShield、Wix Toolset、ClickOnce 等等,這裡以 Inno Setup 為例簡單演示下如何構建安裝包,以及在 Visual Studio 中編譯程式時自動去構建這個安裝包。
2. 操作演示
Tips:如果是想自動化構建,建議先從文章尾部開始看起,前面只是簡單演示如何手動構建
2.1. 去官網下載 Inno Setup 打包工具
點擊 Inno Setup Downloads 下載:

如果有中文需求,則需下載中文包,下載位址:Inno Setup Translations

下載完手動放進 Inno Setup 安裝目錄下的 Languages 目錄下即可

2.2. 建立打包專案

2.3. 填寫應用基本資訊

2.4. 填寫應用安裝目錄

2.5. 在 VS 中右鍵專案屬性,更改專案輸出路徑,有多個專案則都改為同一個

2.6. 選擇應用需要打包的檔案

Application main executable file: 應用程式主程式
Other application files: 主程式所依賴的專案或第三方依賴等,這裡建議直接選擇輸出目錄
2.7. 應用檔案類型關聯

若你程式用不上這個功能一般不用勾選。
2.8. 應用程式捷徑建立

2.9. 應用協議許可檔案

2.10. 安裝模式選擇

2.11. 安裝包語言選擇

官方預設是不提供中文語言包的,但官網上有第三方使用者提供和維護了中文包,有需要的可以在 Inno Setup Translations下載,然後手動放進 Inno Setup 安裝目錄下的 Languages 下即可,連結前面也提到過。
2.12. 安裝包設定

2.13. 設定完了就會產生一個指令碼

2.14. 編譯完成,則會在目錄產生一個 exe 檔案,雙擊就可以進行安裝

2.15. 安裝效果

至此,一個簡易的安裝包製作完成。
但....這並不是本篇的主題。顯而易見,如果每次程式有改動,就需要去 Inno Setup 的編輯器手動執行編譯一下產生安裝包,有些繁瑣。
3. 自動化構建安裝包
3.1. 修改剛才建立安裝包時產生的指令碼檔案
主要是將絕對路徑改為相對路徑以及自動取得主程式檔案版本等,避免其他同事/電腦編譯時報錯,可以參考下我的指令碼
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "傲慢與偏見"
#define MyAppPublisher "版權資訊"
#define MyAppURL "https://www.cnblogs.com/chonglu"
#define MyAppExeName "Inno SetupSample.exe"
#define MyAppVersion GetVersionNumbersString("..\output\Inno SetupSample.exe")
[Setup]
; #define MyAppVersion GetVersionNumbersString("E:\01-專案程式碼\YZS\KJT\trunk\KJT\bin\KJT.exe")
; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{72EC6D66-B10E-4E61-920F-86852D3FFA91}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\KJT
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
; Uncomment the following line to run in non administrative install mode (install for current user only.)
;PrivilegesRequired=lowest
OutputBaseFilename=KJTStep
SetupIconFile=AppICon.ico
Compression=lzma
SolidCompression=yes
WizardStyle=modern
OutputDir=..\Publish
[Languages]
Name: "Chinese"; MessagesFile: "compiler:Languages\中文简体.isl"
[Files]
Source: "..\bin\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\bin\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
3.2. 把 Inno Setup 的安裝目錄拷貝一下放到工程目錄
裡面有些無用的可以刪掉,減小體積,可以參考以下

3.3. 設定專案主程式產生後事件

參考命令:
IF "$(ConfigurationName)" == "Release" (
"$(SolutionDir)DevOps\InnoSetup\ISCC.exe" "$(SolutionDir)DevOps\InnoSetup\KJTStep.iss"
start explorer /select,"$(SolutionDir)DevOps\Publish\"
)
為防止影響除錯,可以加個判斷,只有 Release 模式編譯專案則執行命令,該命令的意思就是透過呼叫解決方案下的 ISCC 程式傳入安裝包指令碼從而構建編譯出一個最新的安裝包,最後再調起檔案資源管理器開啟安裝包目錄。
4. 效果演示

每次需要發佈新版本時,將解決方案切換為 Release 模式編譯,F6 Build 一下,安裝包就自動產生出來了,這裡只是拋磚引玉給個思路,可以多閱讀下官方文件實現出更為完美的安裝包。
Tips:為避免編寫程式碼除錯時編譯速度過慢,最好還是要在產生後事件中加上 Release 模式的判斷,當解決方案中有很多個專案時,或編譯目錄依賴檔案過多的情況下,Inno Setup 構建的會有點慢。
5. 結語
Visual Studio 中的產生事件其實是一個很實用的東西,可以在編譯前、編譯後自動化執行一些經常需要人為手工操作的事,例如還可以利用產生後事件進行程式碼混淆,本篇文章就暫時不展開細說了。
如果在實際操作中遇到錯誤或有疑問,以及更好的建議可以在評論中交流..
6. 附錄
Inno Setup 官網:https://jrsoftware.org/
Inno Setup 編輯器:https://jrsoftware.org/isdl.php
Inno Setup 語言包:https://jrsoftware.org/files/istrans/
Inno Setup 文件:https://jrsoftware.org/ishelp/