本文由網友投稿,.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/