fix(deploy): -NoFrontendDist 保留 backend/web,单端口瘦包改用 -SkipServiceWrapper
2个文件已修改
41 ■■■■■ 已修改文件
HANDOFF.md 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pack-deploy.ps1 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HANDOFF.md
@@ -17,13 +17,14 @@
- **其余验证**:`mvn compile`/`mvn test` 通过(无编译告警遗留);Word COM 8 页 15 图(1+2×7);RapidOCR 复检 12 张折线图数值标签包围框重叠数 = 0;`label_affinity` 复检图 11 每个数据标签到本线 3~8px 且本线是最近线(无「CLOSER TO 其他色」);放大 6× 复核图 11 左上标签确为 `630.99`(低分辨率 OCR 曾误读为 `1630.99`)。v27↔v35 像素差约 1%,集中在标签处,即白描边生效且未破坏折线。
- **产物与状态**:`_tmp_holiday_verify/holiday_trend_2026-10-04_v35.docx`;下载副本 `C:\Users\jcxiong\Downloads\2026年十一假期全省综合运输客流量走势图(修改版-数字贴近折线-白边清晰).docx`。未导入、覆盖或重导任何数据。待用户验收;验收前不提交、不推送;现有 `deploy/traffic-audit-deploy-20261004.zip` 仍是 v24 行为,验收后需重建。
### 10-05:走势图 v35 验收通过 + 单端口瘦包发布( -NoFrontend )
### 10-05:走势图 v35 验收通过 + 单端口发布包(-NoFrontendDist -SkipServiceWrapper)
- **验收**:v35(折线数值标签回到贴近本点 + 白描边)2026-10-05 用户验收通过。
- **打包需求**:服务器单端口部署,前端本次未变动,要求发布包不含前端以缩小体积。
- **打包工具**:`pack-deploy.ps1` 新增 `-NoFrontend`。开启后不执行 npm 构建、不要求 `traffic-audit-web\dist`、不生成 `frontend\`、不复制 `backend\web`;其余(占位符构建 + 去密自检 + db + docs + README + WinSW)照旧。部署机保留上一版 `backend\web`,本次只替换 jar。
- **发布包**:`deploy/traffic-audit-deploy-20261005/`(311 文件 / 105.71 MB;zip 83.60 MB)。已核对:无 `frontend/`、无 `backend\web`;jar 内置配置全占位符(去密自检通过);包内 `HolidayTrendChartService.class` 与 `target/classes` 一致(即含 v35 代码)。体积说明:前端 dist 仅约 4.8 MB,包体主要来自 jar(56.3 MB)与 WinSW(17.4 MB)。
- **部署注意**:本包不含前端,部署时不要删除部署机原有 `backend\web\`,否则页面 404;只覆盖 jar(及按需 application.yml)。
- **打包需求(用户澄清)**:服务器单端口,只需要 `backend\web`,不要独立的 `frontend/dist`;为保证包完整,`backend\web` + jar + docs 都要。服务器非首次发布、服务已装,可加 `-SkipServiceWrapper` 去掉服务注册器。
- **打包工具修正**:先前加的 `-NoFrontend` 语义错了(把 `backend\web` 也去掉了),现改为 `-NoFrontendDist`。它只跳过独立 `frontend\` 目录(不复制 dist / nginx 示例),**仍构建(或要求)dist 并同步 `backend\web`**(单端口必需,否则页面 404)。`-SkipFrontend` 仍为“不重建、复用现有 dist”。
- **发布包**:`deploy/traffic-audit-deploy-20261005-2/`(351 文件 / 94.55 MB;zip **77.78 MB**)。已核对:无 `frontend/`、无 `trafficAudit.exe/.xml/install-service*`(服务包装器已排除);`backend\web` 44 文件与 `frontend\dist` 逐文件哈希一致;jar 内置配置全占位符(去密自检通过);包内 `HolidayTrendChartService.class` 与 `target/classes` 一致(含 v35 代码)。较上一完整包(110.49 MB / zip 83.77 MB)省约 16 MB 解压 / 6 MB 压缩。
- **作废**:`deploy/traffic-audit-deploy-20261005/`(错误语义下的产物,缺 `backend\web`)已被 `-2` 取代,勿用。
- **部署注意**:覆盖 jar(及按需 `application.yml`)即可;`backend\web` 已随包提供。服务已装,无需重新注册。
- **状态**:已打包,待用户上传到服务器。
### 10-04 深夜:折线数值标签避开折线并贴近本线(v31,待用户验收)
pack-deploy.ps1
@@ -3,16 +3,16 @@
  用法:
    powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1
    powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1 -OutRoot "E:\试验" -SkipFrontend
    powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1 -NoFrontend
      —— 单端口瘦包:完全不打包前端(不构建 npm、不复制 frontend/dist 与 backend/web),
         部署机保留原有 backend\web,仅替换 jar,可显著减小包体积。
    powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1 -NoFrontendDist -SkipServiceWrapper
      —— 单端口发布:不生成独立的 frontend\dist 目录(仍构建并同步 backend\web,单端口必需);
         服务器已装服务时配合 -SkipServiceWrapper 去掉约 17 MB 的 WinSW,可显著减小包体积。
  做五件事:
    1) 用 deploy-templates\jar-application.yml(全占位符)临时替换源码 application.yml,
       执行 mvn clean package;无论成败都还原开发机真实配置
    2) 解压 jar 检查内置 application.yml:必须全是占位符(禁止 sk- 密钥 / 明文口令),不合格直接中止
    3) npm run build 重建前端 dist(可 -SkipFrontend)
    4) 组装完整部署包:backend(jar + application.yml + 启动脚本 + 服务包装器 + docs + web) / frontend/dist / db / README
    4) 组装完整部署包:backend(jar + application.yml + 启动脚本 + 服务包装器 + docs + web) / frontend/dist(可选,-NoFrontendDist 不打) / db / README
       Windows 服务包装器 WinSW:优先用 deploy-templates\tools\winsw.exe 缓存(校验 SHA-256),
       缺失时自动下载 v2.12.0 x64 到该缓存目录;随包输出为 backend\trafficAudit.exe
    5) 对组装后的整包再扫一遍明文密钥
@@ -25,7 +25,7 @@
param(
  [string]$OutRoot = '',
  [switch]$SkipFrontend,
  [switch]$NoFrontend,      # 单端口瘦包:完全不打包前端(不构建/不复制 dist 与 backend\web),部署机保留原有 web/
  [switch]$NoFrontendDist,  # 单端口发布:不打独立的 frontend\dist 目录,但仍构建/同步 backend\web(单端口必需)
  [switch]$SkipBackend,     # 复用已存在的 jar(不重编译、不动源码配置),仅用于补全/重组发布包
  [switch]$SkipServiceWrapper   # 不把 WinSW 服务包装器打进包(即不提供“注册成 Windows 服务”的开机自启)
)
@@ -110,10 +110,9 @@
Write-Host '      通过:jar 内置配置全部为占位符,无明文密钥/口令。'
# ---------- [3/5] 前端构建 ----------
Write-Host '[3/5] 构建前端(npm run build,可 -SkipFrontend / -NoFrontend 跳过)...'
if ($NoFrontend) {
  Write-Host '      已按 -NoFrontend 跳过:本次不打前端(单端口瘦包,部署机保留原有 backend\web)'
} elseif (-not $SkipFrontend) {
# 单端口部署必须有 backend\web,所以即使 -NoFrontendDist 也需要 dist;只有 -SkipFrontend 才复用现有 dist。
Write-Host '[3/5] 构建前端(npm run build,可 -SkipFrontend 跳过)...'
if (-not $SkipFrontend) {
  Push-Location (Join-Path $root 'traffic-audit-web')
  try {
    cmd /c "npm.cmd run build > ..\pack-front.log 2>&1"
@@ -124,7 +123,7 @@
} else {
  Write-Host '      已按 -SkipFrontend 跳过,使用现有 dist'
}
if (-not $NoFrontend -and -not (Test-Path $webDist)) { throw "未找到前端产物:$webDist(去掉 -SkipFrontend 重新构建)" }
if (-not (Test-Path $webDist)) { throw "未找到前端产物:$webDist(去掉 -SkipFrontend 重新构建)" }
# ---------- WinSW(Windows 服务包装器)准备:本地缓存优先,缺失时从官方发布页下载并校验 SHA-256 ----------
# WinSW v2.12.0 官方产物未做 Authenticode 签名,所以以固定 SHA-256 作为完整性校验。
@@ -166,7 +165,7 @@
$dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp)
$n = 2
while (Test-Path $dest) { $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp + "-" + $n); $n++ }
if ($NoFrontend) {
if ($NoFrontendDist) {
  New-Item -ItemType Directory -Force -Path (Join-Path $dest 'backend'), (Join-Path $dest 'db') | Out-Null
} else {
  New-Item -ItemType Directory -Force -Path (Join-Path $dest 'backend'), (Join-Path $dest 'frontend'), (Join-Path $dest 'db') | Out-Null
@@ -185,16 +184,15 @@
  Copy-Item (Join-Path $tplDir 'backend\install-service.ps1') (Join-Path $dest 'backend') -Force
  Copy-Item (Join-Path $tplDir 'backend\install-service.cmd') (Join-Path $dest 'backend') -Force
}
if (-not $NoFrontend) {
if (-not $NoFrontendDist) {
  Copy-Item $webDist (Join-Path $dest 'frontend') -Recurse -Force
  Copy-Item (Join-Path $tplDir 'frontend\nginx.conf.example') (Join-Path $dest 'frontend') -Force
}
Copy-Item (Join-Path $tplDir 'db\*.sql') (Join-Path $dest 'db') -Force
# 单端口 8090 模式:后端从 jar 同级 web\ 读前端静态文件,必须和 dist 内容一致
if (-not $NoFrontend) {
  Copy-Item $webDist (Join-Path $dest 'backend\web') -Recurse -Force
}
# 单端口 8090 模式:后端从 jar 同级 web\ 读前端静态文件,必须和 dist 内容一致。
# 单端口发布(-NoFrontendDist)同样必须同步,否则页面 404。
Copy-Item $webDist (Join-Path $dest 'backend\web') -Recurse -Force
# docs:运行时模板 + 用户文档;排除开发过程文档与缓存/备份(减小体积、避免把内部清单带出去)
$docsDest = Join-Path $dest 'backend\docs'