;iss ; 构建时间:2025-8-18 14:13:19 #define MyAppName "模型管理" #define MyAppVersion "v1.0.19" #define MyAppPublisher "X" #define MyAppURL "~" #define MyAppExeName "model" #define MyAppExeNameHump "Model" #define MyAppExeNameUpper "MODEL" #define MyAppAssocName MyAppName + " File" #define MyAppAssocExt ".myp" #define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt #define MyAppFirstPath "XManage" #define MyAppResources "Resources_783" #define InstallPassword GetDateTimeString('yyyymmdd', '', '') ; 默认配置 [Setup] AppId={{7C6B5A4D-3E2F-1G0H-9I8J-7K6L5M4N3O2P} ; 默认安装路径 DefaultDirName={autopf}\{#MyAppFirstPath} ; 安装密码 Password={#InstallPassword} ; 是否加密 Encryption=yes ; ICO图标 SetupIconFile={#MyAppResources}\icon.ico VersionInfoProductVersion=1.0.0 VersionInfoCompany= VersionInfoDescription={#MyAppName}服务 VersionInfoCopyright=CopyRight © 2025 VersionInfoProductName={#MyAppName} ; 默认配置 AppName={#MyAppName} AppVersion={#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} ChangesAssociations=yes DisableDirPage=no DisableProgramGroupPage=yes Compression=lzma2 SolidCompression=yes WizardStyle=modern ChangesEnvironment=yes PrivilegesRequired=admin ArchitecturesAllowed=x64compatible ArchitecturesInstallIn64BitMode=x64compatible OutputDir=Release\ OutputBaseFilename={#MyAppExeNameHump}Setup-{#MyAppVersion}-783 UninstallFilesDir={app}\{#MyAppExeName} UninstallDisplayIcon={app}\{#MyAppExeName}\{#MyAppExeName}.exe ; 语言选择 [Languages] Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl" ;; 任务 [Tasks] ; 是否创建桌面图标 ; checkablealone 默认选中 ; unchecked 默认不选中 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone ;; 程序 ICO [Icons] ; ====================== ========================================================= 此处使用 console 显式console启动 Name: "{autoprograms}\{#MyAppFirstPath}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}-console.exe" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}-console.exe"; Tasks: desktopicon ;; 组件安装方式 [Types] ; 完整安装所有组件 Name: full; Description: 完整组件安装 Name: mini; Description: 最小安装; ; 自定义安装 Name: custom; Description: 自定义安装; Flags: iscustom ;; 组件列表选择项 [Components] Name: Starter; Description: {#MyAppName} 启动; Types: full; Name: UI; Description: {#MyAppName} UI; Types: full mini; Name: Server; Description: {#MyAppName} Server; Types: full mini; Name: MySQL_BIN; Description: MySQL数据库; Types: full; Flags: checkablealone Name: MySQL_DATA; Description: {#MyAppName} Data; Types: full; Name: USR; Description: 运行时环境; Types: full mini; Flags: checkablealone Name: JDK21; Description: JDK 21 运行时环境; Types: full; Flags: checkablealone ;Name: Redis; Description: 缓存; Types: full; Flags: checkablealone Name: IO; Description: 文件资源服务; Types: full; Flags: checkablealone ;; 安装包引入文件列表 [Files] ; 后端工程+启动器 Source: "{#MyAppResources}\{#MyAppExeName}.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter; Source: "{#MyAppResources}\{#MyAppExeName}-console.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter; Source: "{#MyAppResources}\{#MyAppExeName}-x64.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter; Source: "{#MyAppResources}\{#MyAppExeName}-x86.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter; Source: "{#MyAppResources}\patch.exe"; DestDir: "{app}\{#MyAppExeName}"; DestName: "patch.exe"; Flags: ignoreversion; Components: Starter; ;Windows 10 环境,不提供 bat 启动 ;Source: "{#MyAppResources}\{#MyAppExeName}.bat"; DestDir: "{app}\{#MyAppExeName}"; DestName: "{#MyAppExeName}.bat"; Flags: ignoreversion; Components: Starter; Source: "{#MyAppResources}\server\demo-0.0.1.jar"; DestDir: "{app}\{#MyAppExeName}\bin"; Flags: ignoreversion; Components: Server; ; 更新数据库脚本 Source: "{#MyAppResources}\script\*"; DestDir: "{app}\{#MyAppExeName}\script"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Server; ; 前端工程 + Nginx Source: "{#MyAppResources}\web\*"; DestDir: "{app}\{#MyAppExeName}\web"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Starter; Source: "{#MyAppResources}\dist\*"; DestDir: "{app}\{#MyAppExeName}\web\dist"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: UI; ; Linux 命令集(通用服务) Source: "{#MyAppResources}\usr\*"; DestDir: "{app}\usr\"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: USR; ; 后端启动 JDK 依赖(通用服务) Source: "{#MyAppResources}\java\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: JDK21; ; 数据库依赖 Source: "{#MyAppResources}\database\ProgramData\*"; DestDir: "{commonappdata}\MySQL"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: MySQL_DATA; Source: "{#MyAppResources}\database\ProgramFiles\*"; DestDir: "{pf}\MySQL"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: MySQL_BIN; ; MinIO 服务(通用服务) Source: "{#MyAppResources}\io\*"; DestDir: "{app}\io"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: IO; ;; 创建必要目录 [Dirs] Name: "{app}\{#MyAppExeName}\web\logs"; Permissions: users-modify; Components: Starter; Name: "{app}\{#MyAppExeName}\web\temp"; Permissions: users-modify; Components: Starter; ;; 安装时注册表与环境变量列表 [Registry] ; 默认注册信息 Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName}\{#MyAppExeName}.exe,0" Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}\{#MyAppExeName}.exe"" ""%1""" ; 配置JDK环境变量(通用服务) Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: JDK21; \ ValueName: "JDK_21"; ValueData: "{app}\jre"; ;; MinIO环境变量(通用服务) ;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: IO; \ ValueName: "X_MIO"; ValueData: "{app}\io"; ;; Linux(通用服务) Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: USR; \ ValueName: "X_COMMAND"; ValueData: "{app}\usr"; ; 追加到 PATH 变量 Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; Flags: preservestringtype; Components: USR; AfterInstall: RefreshEnvironment; \ ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%"; Check: NeedsAddPath('%X_COMMAND%'); ;; MySQL环境变量(注册服务使用) ; 可能存在多个服务打通,MySQL环境变量由此变为 X Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL_BIN; \ ValueName: "X_MANAGE_DB_SC"; ValueData: "x_database"; ; 这两个值,将作为后续判断程序是否已经安装做依据 Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL_BIN; \ ValueName: "X_MANAGE_DB_EXE"; ValueData: "{pf}\MySQL\MySQL Server 8.4.5\bin\mysqld.exe"; Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL_BIN; \ ValueName: "X_MANAGE_DB_COF"; ValueData: "{commonappdata}\MySQL\MySQL Server 8.4\my.ini"; ;; MySQL(通用服务),导入脚本数据使用 Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: MySQL_BIN; \ ValueName: "X_COMMAND_MYSQL"; ValueData: "{pf}\MySQL\MySQL Server 8.4.5"; ; 追加到 PATH 变量 Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; Flags: preservestringtype; Components: MySQL_BIN; AfterInstall: RefreshEnvironment; \ ValueName: "Path"; ValueData: "{olddata};%X_COMMAND_MYSQL%\bin"; Check: NeedsAddPath('%X_COMMAND_MYSQL%\bin'); Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \ ValueName: "{#MyAppExeNameUpper}_MAIN"; ValueData: "{app}\{#MyAppExeName}"; ;; springboot启动变量(启动程序使用) ; 可能存在多个服务打通,变量由lib变为服务名 Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \ ValueName: "{#MyAppExeNameUpper}_MANAGE_BIN"; ValueData: "{app}\{#MyAppExeName}\bin\demo-0.0.1.jar"; Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \ ValueName: "{#MyAppExeNameUpper}_MANAGE_DB_SERVER"; ValueData: "127.0.0.1"; Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \ ValueName: "{#MyAppExeNameUpper}_MANAGE_DB_PORT"; ValueData: "33306"; Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; Components: Server; \ ValueName: "{#MyAppExeNameUpper}_VM_PARAMS"; ValueData: " \ --enable-preview \ -Dserver.port=28680 \ -Dproject.database-name=model \ "; ;; 安装完运行的菜单与后续操作 ; [Run] ;; 安装完成后运行 startup.exe ; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: postinstall runascurrentuser waituntilterminated skipifsilent hidewizard; ; Filename: "timeout"; Parameters: "/t 2 /nobreak >nul && {app}\{#MyAppExeName}.exe"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: postinstall runascurrentuser waituntilterminated skipifsilent hidewizard; ;; 自定义函数 [Code] const WM_SETTINGCHANGE = 26; // 0x001A 的十进制 SMTO_ABORTIFHUNG = 2; // 0x0002 的十进制 // 定义 VC++ 2019 运行时的注册表检查路径 VC2019_REDIST_X64 = '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}'; VC2019_REDIST_X86 = '{422B21A3-06FA-3F2F-A6C6-21BCC9B8E2F3}'; // 获取安装密码 function GetInstallPassword(): string; begin Result := GetDateTimeString('yyyymmdd', '', ''); end; function SendMessageTimeout( hWnd: Integer; Msg: Integer; wParam: Integer; lParamStr: String; fuFlags: Integer; uTimeout: Integer; var lpdwResult: Integer ): Integer; external 'SendMessageTimeoutW@user32.dll stdcall'; // 给 Path 系统环境变量追加环境 function NeedsAddPath(Param: string): boolean; var OrigPath: string; begin if not RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', OrigPath) then begin Result := True; exit; end; // 检查路径是否已存在 Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0; if Result = True then Result := Pos(';' + Param + '\;', ';' + OrigPath + ';') = 0; end; // 刷新系统环境 procedure RefreshEnvironment; var Res: Integer; begin SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0, 'Environment', SMTO_ABORTIFHUNG, 5000, Res ); end; // 检查环境变量,路径是否存在空格 function CheckRegistryPath(Path: string): Boolean; begin if Pos(' ', Path) > 0 then begin SuppressibleMsgBox('安装程序错误: 检测到无效的注册表路径 "' + Path + '"。路径不能包含空格。', mbCriticalError, MB_OK, IDOK); Abort; Result := False; Exit; end; Result := True; end; // 以 UTF-8 写入文件 function SaveStringToUTF8File(const FileName, Content: String; Append: Boolean): Boolean; var UTF8Content: AnsiString; begin UTF8Content := UTF8Encode(Content); Result := SaveStringToFile(FileName, UTF8Content, Append); end; // 检查是否已安装 VC++ 2019 运行时 function IsVC2019Installed: Boolean; var Version: String; begin // 检查64位版本 Result := RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', Version ) or RegKeyExists( HKLM, 'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X64 ); // 如果是32位系统或需要检查32位运行时 if not Result and (not IsWin64) then Result := RegQueryStringValue( HKLM, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86', 'Version', Version ) or RegKeyExists( HKLM, 'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X86 ); end; // 在安装前检查 function InitializeSetup: Boolean; begin // 默认允许安装继续 Result := True; // 如果 VC++ 2019 未安装 if not IsVC2019Installed then begin MsgBox('本程序需要 Microsoft Visual C++ 2019 运行时才能继续(1001)', mbError, MB_OK) // 中止安装 Result := False; end; end; [UninstallRun] Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-web.exe"; Flags: runascurrentuser runhidden waituntilterminated Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-console.exe"; Flags: runascurrentuser runhidden waituntilterminated Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-x86.exe"; Flags: runascurrentuser runhidden waituntilterminated Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}-x64.exe"; Flags: runascurrentuser runhidden waituntilterminated Filename: "taskkill"; Parameters: "-f -im {#MyAppExeName}.exe"; Flags: runascurrentuser runhidden waituntilterminated ;; 卸载时删除的文件 [UninstallDelete] Type: filesandordirs; Name: "{app}\{#MyAppExeName}\log" Type: filesandordirs; Name: "{app}\{#MyAppExeName}\script" Type: filesandordirs; Name: "{app}\{#MyAppExeName}\patch"