在展厅项目中,打包出来的通常是一组文件,包含可执行主程序、dll、一些资源等;这些资源复制粘贴挺浪费时间的,并且还要手动设置自身的开机自启动。

为了解决快速部署,避免来回压缩和设置开机自启动,找到了款名叫InnoSetup的安装包制作工具。其使用的是一个比较老的Delphi语言,当然不需要单独去学,完全可以借助AI给你写一个好的安装程序。

官网

https://jrsoftware.org/isinfo.php

示例

; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!

#define MyAppName "app名称"
#define MyAppVersion "版本"
#define MyAppPublisher "公司"
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "主启动可执行文件"
#define MyAppId "唯一APPID"
#define AppFolder 自定义过的安装路路径"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID"。)
SetupIconFile=logo路径
AppId={#MyAppId}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={autopf}\{#MyAppName}
DefaultGroupName={#MyAppName}
; 以下行取消注释,以在非管理安装模式下运行(仅为当前用户安装)。
;PrivilegesRequired=lowest
OutputDir=/
OutputBaseFilename={#MyAppName}—安装程序
Compression=lzma
SolidCompression=yes
WizardStyle=modern
Uninstallable=yes
; 控制面板中显示
 CreateUninstallRegKey=yes
 ;设置以 64位程序运行
 ArchitecturesAllowed=x64
 ArchitecturesInstallIn64BitMode=x64
 ;显示欢迎界面
 DisableWelcomePage=no

[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone

[Files]
Source: "/程序_protected\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "/程序_protected\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{autodesktop}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" ; Tasks: desktopicon
Name: "{autodesktop}\数据目录"; Filename: "{app}\MediaPlayer_Data\StreamingAssets"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

[Messages]
BeveledLabel=项目程序
WelcomeLabel2=现在将安装 [name/ver] 到您的设备中。
 ButtonCancel=退出安装 (&Q)  
 ClickNext=单击“下一步”继续,或单击“退出安装”退出安装程序。

 [Registry]
  ; 设置注册表,实现开机自启
  ;Root: HKCU; Subkey:"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "testApp";ValueData: "{app}\{#MyAppExeName} /start"; Flags: deletevalue uninsdeletevalue
 ; Root: HKLM; Subkey:"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "testApp";ValueData: "{app}\{#MyAppExeName} /start"; Flags: deletevalue uninsdeletevalue
  Root: HKLM; Subkey:"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "testApp";ValueData: "{app}\{#MyAppExeName} /start"; Flags: deletevalue uninsdeletevalue; Check:IsWin64
[Code]
function InitializeSetup(): boolean;
var
  ResultStr: String;
  ResultCode: Integer;
begin
  if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#MyAppId}_is1', 'UninstallString', ResultStr) then
    begin
      ResultStr := RemoveQuotes(ResultStr);
      Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    end;
    result := true;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usDone then
    begin
    DelTree(ExpandConstant('{app}'), True, True, True);
    end;
end;