【模型】 安装包编译流程
This commit is contained in:
parent
bae2e9d675
commit
77b38edd49
0
server/model/Execute/Readme.md
Normal file
0
server/model/Execute/Readme.md
Normal file
@ -0,0 +1,10 @@
|
||||
|
||||
## 编译流程
|
||||
|
||||
- 1、 运行 `resources-initialize.bat` 初始化默认资源获取目录
|
||||
- 2、 dist 存放前端 build 内容
|
||||
- 3、 script 将按照数据库名称,存放SQL脚本
|
||||
- 4、 server 存放后端 jar
|
||||
- 5、 web 存放 nginx 程序
|
||||
- 6、 启动 `install-win7-model.iss` 进行编译,编译完成后 Release 文件夹中会出现编译后的安装包
|
||||
- 7、 配合 base 编译后安装程序,形成完整运行环境,支持 Windows 7 运行
|
0
server/model/Release/Readme.md
Normal file
0
server/model/Release/Readme.md
Normal file
56
server/model/Resources/web/conf/model-windows.conf
Normal file
56
server/model/Resources/web/conf/model-windows.conf
Normal file
@ -0,0 +1,56 @@
|
||||
server {
|
||||
listen 18680;
|
||||
server_name _;
|
||||
# gzip config
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_comp_level 9;
|
||||
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
|
||||
gzip_vary on;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
|
||||
root dist;
|
||||
include mime.types;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:28680/;
|
||||
client_max_body_size 100M;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /dev-api/ {
|
||||
proxy_pass http://127.0.0.1:28680/;
|
||||
client_max_body_size 100M;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
location /file/ {
|
||||
proxy_pass http://127.0.0.1:9000/;
|
||||
client_max_body_size 5000M;
|
||||
proxy_redirect off;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
error_page 405 =200 $request_uri;
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
|
||||
if ($request_method = 'OPTIONS') {
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
|
||||
add_header 'Access-Control-Max-Age' 1728000;
|
||||
add_header 'Content-Type' 'text/plain charset=UTF-8';
|
||||
add_header 'Content-Length' 0;
|
||||
return 204;
|
||||
}
|
||||
}
|
||||
}
|
11
server/model/Resources/web/conf/web.conf
Normal file
11
server/model/Resources/web/conf/web.conf
Normal file
@ -0,0 +1,11 @@
|
||||
worker_processes 1;
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
include model-windows.conf;
|
||||
}
|
274
server/model/install-win7-model.iss
Normal file
274
server/model/install-win7-model.iss
Normal file
@ -0,0 +1,274 @@
|
||||
;iss
|
||||
|
||||
#define MyAppName "模型管理"
|
||||
#define MyAppVersion "v1.0.0"
|
||||
#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
|
||||
|
||||
|
||||
; 默认配置
|
||||
[Setup]
|
||||
AppId={{A0EBDCA7-8C1A-43FD-BD3A-7E9E6D8B7F6C}
|
||||
; 默认安装路径
|
||||
DefaultDirName={localappdata}\XManage
|
||||
; 安装密码
|
||||
Password=20250813
|
||||
; 是否加密
|
||||
Encryption=yes
|
||||
; ICO图标
|
||||
;SetupIconFile=Resources\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}
|
||||
UninstallFilesDir={app}\{#MyAppExeName}
|
||||
UninstallDisplayIcon={app}\{#MyAppExeName}\{#MyAppExeName}.bat
|
||||
|
||||
|
||||
; 语言选择
|
||||
[Languages]
|
||||
Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl"
|
||||
|
||||
|
||||
;; 任务
|
||||
[Tasks]
|
||||
; 是否创建桌面图标
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
|
||||
|
||||
;; 程序 ICO
|
||||
[Icons]
|
||||
;Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"
|
||||
;Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"; Tasks: desktopicon
|
||||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}\{#MyAppExeName}.bat"; 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: Data; Description: {#MyAppName} Data; Types: full;
|
||||
|
||||
|
||||
;; 安装包引入文件列表
|
||||
[Files]
|
||||
; 后端工程+启动器
|
||||
;Source: "Resources\{#MyAppExeName}.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\{#MyAppExeName}-console.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\{#MyAppExeName}-x64.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\{#MyAppExeName}-x86.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
;Source: "Resources\patch.exe"; DestDir: "{app}\{#MyAppExeName}"; Flags: ignoreversion; Components: Starter
|
||||
|
||||
Source: "Resources\{#MyAppExeName}.bat"; DestDir: "{app}\{#MyAppExeName}"; DestName: "{#MyAppExeName}.bat"; Flags: ignoreversion; Components: Starter
|
||||
Source: "Resources\server\demo-0.0.1.jar"; DestDir: "{app}\{#MyAppExeName}\bin"; Flags: ignoreversion; Components: Server
|
||||
|
||||
; 更新数据库脚本
|
||||
Source: "Resources\script\*"; DestDir: "{app}\{#MyAppExeName}\script"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Data
|
||||
|
||||
; 前端工程 + Nginx
|
||||
Source: "Resources\web\*"; DestDir: "{app}\{#MyAppExeName}\web"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Starter;
|
||||
Source: "Resources\dist\*"; DestDir: "{app}\{#MyAppExeName}\web\dist"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: UI;
|
||||
|
||||
|
||||
;; 创建必要目录
|
||||
[Dirs]
|
||||
Name: "{app}\{#MyAppExeName}\web\logs"; Permissions: users-modify; Components: Starter;
|
||||
Name: "{app}\{#MyAppExeName}\web\temp"; Permissions: users-modify; Components: Starter;
|
||||
|
||||
|
||||
;; 安装时注册表与环境变量列表
|
||||
[Registry]
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||||
ValueName: "{#MyAppExeNameUpper}_MAIN"; ValueData: "{app}\{#MyAppExeName}";
|
||||
; 启动jar
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||||
ValueName: "{#MyAppExeNameUpper}_MANAGE_BIN"; ValueData: "{app}\{#MyAppExeName}\bin\demo-0.0.1.jar";
|
||||
; 扩展启动vm变量
|
||||
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; Flags: uninsdeletevalue; \
|
||||
ValueName: "{#MyAppExeNameUpper}_VM_PARAMS"; ValueData: " \
|
||||
--enable-preview \
|
||||
-Dserver.port=28680 \
|
||||
-Dproject.database-ip=127.0.0.1 \
|
||||
-Dproject.database-port=33306 \
|
||||
-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 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
|
||||
|
21
server/model/resources-initialize.bat
Normal file
21
server/model/resources-initialize.bat
Normal file
@ -0,0 +1,21 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
chcp 65001 >nul
|
||||
title Initialization
|
||||
|
||||
set "BASE_PATH=Resources/"
|
||||
|
||||
echo [INFO] 正在创建 【模型】 初始化构建安装包目录结构
|
||||
for %%f in (
|
||||
"server"
|
||||
"script/model"
|
||||
"web"
|
||||
"dist"
|
||||
) do (
|
||||
echo [INFO] 创建: %%~f
|
||||
mkdir "%BASE_PATH%/%%~f"
|
||||
echo.
|
||||
)
|
||||
|
||||
pause
|
||||
endlocal
|
Loading…
x
Reference in New Issue
Block a user