WindowsStarter/server/model_full/install-win10-203-model.iss
yuejiajun 0de4810365 783 阶段性封版
203 验收前测试
2025-09-24 23:09:16 +08:00

387 lines
15 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;iss
; 构建时间1.0.23 => 2025-9-19 19:23:21
; 构建时间1.0.24 => 2025-9-20 11:14:40
; 构建时间1.0.25 => 2025-9-20 12:42:38
#define MyAppName "模型管理"
#define MyAppVersion "1.0.25"
#define MyAppVersionString "v" + MyAppVersion
#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_203"
#define InstallPassword GetDateTimeString('yyyymmdd', '', '')
#define BuildTime GetDateTimeString('yyyymmddhhnnss', '', '')
; 默认配置
[Setup]
AppId={{7C6B5A4D-3E2F-1G0H-9I8J-7K6L5M4N3O2P}
; 默认安装路径
DefaultDirName={autopf}\{#MyAppFirstPath}
; 安装密码
Password={#InstallPassword}
; 是否加密
Encryption=yes
; ICO图标
;SetupIconFile={#MyAppResources}\icon.ico
VersionInfoVersion={#MyAppVersion}
VersionInfoProductVersion={#MyAppVersion}
VersionInfoCompany=
VersionInfoCopyright=CopyRight © 2025
VersionInfoDescription=构建于 {#BuildTime}{#MyAppName}服务
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-{#MyAppVersionString}-203
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 \
-Dspring.profiles.active=dev,mysql \
-Dserver.port=28680 \
-Dproject.database-name=model \
-Dproject.minio-url=http://127.0.0.1:9000 \
";
;; 安装完运行的菜单与后续操作
; [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"