Просмотр исходного кода

chore(gallery): 新增 sync-index.ps1 —— 发布前按发布仓实际包校正索引

构建机的 gallery 源与发布仓长期各自打包,打包时的 REGEN 是按本地源算的 size/sha256。
直接把那份索引推上来,客户端就会拿本地源的数字去校验发布仓里的另一个文件,
安装时报 大小不匹配(典型报错:期望 92218 字节,实际 92093 字节)。
以后流程固定为:放包 → 跑本脚本 → 提交 → 推送。
王硕 6 дней назад
Родитель
Сommit
7893a06734
1 измененных файлов с 82 добавлено и 0 удалено
  1. 82 0
      sync-index.ps1

+ 82 - 0
sync-index.ps1

@@ -0,0 +1,82 @@
+<#
+.SYNOPSIS
+    按【发布仓里真实存在的包】重算 index.json 的 size / sha256。
+
+.DESCRIPTION
+    为什么必须有这一步:
+      构建机上的 gallery 源(TeamAAS-2.1\gallery)与发布仓(本目录)是两个独立的目录,
+      长期各自打包、各自推送 —— 两边同名包常常不是同一份文件。
+      而打包时会按【本地源】全量 REGEN 索引,若把这份索引直接推到发布仓,
+      客户端就会拿本地源记录的 size/sha256 去校验发布仓里的另一个文件,
+      安装时报 "大小不匹配:期望 X 字节,实际 Y 字节"。
+
+      因此:每次往发布仓放包之后、提交索引之前,必须跑一次本脚本,
+      让索引里的 size/sha256 与发布仓里实际的文件严格一致。
+
+    用法:
+      .\sync-index.ps1            # 校正并打印改动数量
+      .\sync-index.ps1 -Check     # 只检查,不写文件(适合在提交前做校验/输出不符条目数)
+
+.NOTES
+    只改 size / sha256 两个字段,其余元数据(名称/描述/依赖/版本历史)保持原样。
+    编码按原文件的 BOM 状态原样写回,避免把 UTF-8 内容写坏。
+#>
+param(
+    [switch]$Check
+)
+
+$ErrorActionPreference = 'Stop'
+
+$root = $PSScriptRoot
+$idxPath = Join-Path $root 'index.json'
+
+if (-not (Test-Path $idxPath)) { throw "未找到索引文件:$idxPath" }
+
+# 原样保持 BOM 状态
+$bytes = [IO.File]::ReadAllBytes($idxPath)
+$hasBom = ($bytes.Length -ge 3 -and $bytes[0] -eq 239 -and $bytes[1] -eq 187 -and $bytes[2] -eq 191)
+$text = [IO.File]::ReadAllText($idxPath, [Text.Encoding]::UTF8)
+
+# 发布仓里真实存在的包
+$files = @{}
+foreach ($p in (Get-ChildItem (Join-Path $root 'packages') -Recurse -Filter '*.zip' -ErrorAction SilentlyContinue)) {
+    $rel = $p.FullName.Substring($root.Length).TrimStart('\', '/') -replace '\\', '/'
+    $files[$rel] = $p
+}
+
+# 索引里引用到的包路径
+$refs = [regex]::Matches($text, '"downloadUrl":\s*"([^"]+)"') |
+        ForEach-Object { $_.Groups[1].Value } | Sort-Object -Unique
+
+$fixed = 0
+$missing = @()
+
+foreach ($rel in $refs) {
+    if (-not $files.ContainsKey($rel)) { $missing += $rel; continue }
+
+    $f = $files[$rel]
+    $sha = (Get-FileHash $f.FullName -Algorithm SHA256).Hash.ToLower()
+    $size = $f.Length
+    $esc = [regex]::Escape($rel)
+
+    # 结构固定为:downloadUrl → sha256 → size
+    $pattern = '("downloadUrl":\s*"' + $esc + '",\s*"sha256":\s*")[0-9a-fA-F]*(",\s*"size":\s*)\d+'
+    $new = [regex]::Replace($text, $pattern, ('${1}' + $sha + '${2}' + $size))
+    if ($new -ne $text) { $fixed++ }
+    $text = $new
+}
+
+if ($Check) {
+    Write-Host ("不符条目: " + $fixed + " 处")
+} else {
+    [IO.File]::WriteAllText($idxPath, $text, (New-Object Text.UTF8Encoding($hasBom)))
+    Write-Host ("索引已按发布仓实际包校正: " + $fixed + " 处(BOM=" + $hasBom + ")")
+}
+
+if ($missing.Count -gt 0) {
+    Write-Host "警告:索引中有 $($missing.Count) 个条目指向发布仓不存在的包(客户端安装会 404):" -ForegroundColor Yellow
+    $missing | Sort-Object -Unique | ForEach-Object { Write-Host ("   " + $_) -ForegroundColor Yellow }
+}
+
+if ($Check -and $fixed -gt 0) { exit 1 }
+exit 0