利用InnoStep在VS編譯時自動構建安裝包

2023-07-20 06:01:07

摘要

很多C/S開發領域的同學或多或少都可能會遇到需要製作安裝包的場景,打包的工具也是五花八門,例如有NSIS、InstallShield、Wix Toolset、ClickOnce等等,這裡以Inno Setup為例簡單演示下如何構建安裝包,以及在Visual Studio中編譯程式時自動去構建這個安裝包。

操作演示

Tips:如果是想自動化構建,建議先從文章尾部開始看起,前面只是簡單演示如何手動構建

1、去官網下載Inno Setup打包工具 Inno Setup Downloads

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

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

2、建立打包專案

3、填寫應用基本資訊

4、填寫應用安裝目錄

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

6、選擇應用需要打包的檔案

Application main executable file:應用程式主程式

Other application files:主程式所依賴的專案或第三方依賴等,這裡建議直接選擇輸出目錄

7、應用檔案型別關聯

若你程式用不上這個功能一般不用勾選

8、應用程式快捷方式建立

9、應用協定許可檔案

10、安裝模式選擇

11、安裝包語言選擇

官方預設是不提供中文語言套件的,但官網上有第三方使用者提供和維護了中文包,有需要的可以在 Inno Setup Translations下載,然後手動放進InnoStep安裝目錄下的Languages下即可

12、安裝包設定

13、設定完了就會生成一個指令碼

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

15、安裝效果

至此,一個簡易的安裝包製作完成。

但....這並不是本篇的主題。顯而易見,如果每次程式有改動,就需要去InnoStep的編輯器手動執行編譯一下生成安裝包,有些繁瑣。

自動化構建安裝包

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 "InnoStepSample.exe"
#define MyAppVersion GetVersionNumbersString("..\output\InnoStepSample.exe")

[Setup]
; #define MyAppVersion GetVersionNumbersString("..\output\InnoStepSample.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

2、把InnoStep的安裝目錄拷貝一下放到工程目錄,裡面有些無用的可以刪掉,減小體積,可以參考以下

3、設定專案主程式生成後事件

參考命令:

IF "$(ConfigurationName)" == "Release" (
    "$(SolutionDir)DevOps\InnoSetup\ISCC.exe" "$(SolutionDir)DevOps\InnoSetup\KJTStep.iss"
    start explorer /select,"$(SolutionDir)DevOps\Publish\"
)

為防止影響偵錯,可以加個判斷,只有Release模式編譯專案則執行命令,該命令的意思就是通過呼叫解決方案下的ISCC程式傳入安裝包指令碼從而構建編譯出一個最新的安裝包,最後再調起檔案資源管理器開啟安裝包目錄

效果演示

每次需要釋出新版本時,將解決方案切換為Release模式編譯,F6 Build一下,安裝包就自動生成出來了,這裡只是拋磚引玉給個思路,可以多閱讀下官方檔案實現出更為完美的安裝包。

Tips:為避免編寫程式碼偵錯時編譯速度過慢,最好還是要在生成後事件中加上Release模式的判斷,當解決方案中有很多個專案時,或編譯目錄依賴檔案過多的情況下,InnoStep構建的會有點慢。

結語

Visual Studio中的生成事件其實是一個很實用的東西,可以在編譯前編譯後自動化執行一些經常需要人為手工操作的事,比如還可以利用生成後事件進行程式碼混淆,本篇文章就暫時不展開細說了。

如果在實際操作中遇到錯誤或有疑問以及更好的建議可以在評論中交流..

附錄

InnoStep官網:https://jrsoftware.org/

InnoStep編輯器:https://jrsoftware.org/isdl.php

InnoStep語言套件:https://jrsoftware.org/files/istrans/

InnoStep檔案:https://jrsoftware.org/ishelp/