build(release): 增加 ZIP_METHOD=lzma 选项(37 MB 整包被 IIS 30 MB 上限挡住时用)

Windows v0.2.0 发布时,Gitea 站点 IIS 的 maxAllowedContentLength 仍是默认的
30,000,000 字节:16.4 MB 通过,而 38,245,602 B 的整包用**正确**的 multipart 写法
(字段名 attachment)复测依旧 HTTP 413(仅发出 917 KB 即被拒)。为不阻塞发布,
本次给打包脚本增加压缩方式开关:

  ZIP_METHOD=deflate   (默认)约 38 MB,Windows 资源管理器双击即可解压
  ZIP_METHOD=lzma      约 26 MB,可绕过 30 MB 闸;**代价**是 Windows 10 资源管理器
                       不支持 LZMA(method 14) 的 zip,必须用 7-Zip / WinRAR / PeaZip

脚本细节:
- lzma 走 `7z a -tzip -mm=LZMA -mx=9`(缺 7z 时报错并给出安装提示);
- lzma 包额外做 `7z t` 完整性测试,并改用 `7z x` 做解压自检(unzip 对 method 14
  支持不一致,不能用来验证);
- 超限告警里补上「可用 ZIP_METHOD=lzma 绕过」的提示。

README.md / README.txt 同时写明:v0.2.0 的 zip 是 LZMA,需要 7-Zip/WinRAR 解压;
若 IIS 上限已放开,请改用默认 deflate 包。
This commit is contained in:
2026-09-17 03:42:05 +08:00
parent 76244d2d0d
commit fc988e91ee
3 changed files with 56 additions and 10 deletions
+11 -4
View File
@@ -220,10 +220,17 @@ src/
4. 真实 VRM 样例仅放在 `_scratch/`(已 gitignore),版权原因不入库; 4. 真实 VRM 样例仅放在 `_scratch/`(已 gitignore),版权原因不入库;
测试在找不到模型时显式跳过而非伪装通过。 测试在找不到模型时显式跳过而非伪装通过。
5. **Gitea 附件上传上限**:本项目 Gitea 前置 IIS 的默认 5. **Gitea 附件上传上限**:本项目 Gitea 前置 IIS 的默认
`maxAllowedContentLength = 30,000,000` 字节(≈28.6 MiB),实测 30.5 MB / 40 MB `maxAllowedContentLength = 30,000,000` 字节(≈28.6 MiB),实测 16.4 MB 通过、
上传返回 HTTP 413。`v0.1.0` 因此被拆成 `zip.part0/1/2`(无法直接解压)。 30.5 MB / 37 MB / 40 MB 上传返回 **HTTP 413**。`v0.1.0` 因此被拆成
现改为**只上传单个完整包**,超限时打包脚本直接告警并要求运维放宽上限, `zip.part0/1/2`(无法直接解压)。现改为**只上传单个完整包**,超限时打包脚本
不再回退分卷;做法见 `opendance-web/deploy/proxy/README.md`。 直接告警并要求运维放宽上限,不再回退分卷;做法见
`opendance-web/deploy/proxy/README.md` 第九节。
6. **v0.2.0 的 zip 用的是 LZMA 压缩**(`ZIP_METHOD=lzma` 打出来的),因为发布时
IIS 上限尚未放开:整包从约 38 MB 降到约 26 MB 才能传上去。
**代价:Windows 10 的资源管理器不支持 LZMA(method 14) 的 zip,必须用
7-Zip / WinRAR / PeaZip 解压**(Win11 24H2+ 起资源管理器原生支持 7z 等格式,
但本项目未在 Windows 上实测)。若 IIS 上限已放开,请改用默认的 deflate 包
(`bash build/package-release.sh 0.2.0`,产物约 38 MB,双击即可解压)。
## 第三方开源声明 ## 第三方开源声明
+6 -2
View File
@@ -1,5 +1,5 @@
================================================================ ================================================================
OpenDance Studio -- Windows 客户端 v0.2.0 使用说明 OpenDance Studio -- Windows 客户端 v0.2.0 使用说明(zip 为 LZMA 压缩,需用 7-Zip/WinRAR 解压)
================================================================ ================================================================
摄像头跳舞评分系统的核心体验端:接收 Android 辅助 App 通过 WebSocket 摄像头跳舞评分系统的核心体验端:接收 Android 辅助 App 通过 WebSocket
@@ -116,7 +116,11 @@ OpenDance.exe 的用户看第一节即可。
注意:本项目 Gitea 前置 IIS 的默认上传上限是 30,000,000 字节 注意:本项目 Gitea 前置 IIS 的默认上传上限是 30,000,000 字节
(约 28.6 MiB),超过会返回 HTTP 413。这时不要改成分卷, (约 28.6 MiB),超过会返回 HTTP 413。这时不要改成分卷,
请让运维放宽上限(做法见 opendance-web/deploy/proxy/README.md)。 请让运维放宽上限(做法见 opendance-web/deploy/proxy/README.md 第九节)。
发布 v0.2.0 时该上限尚未放开,整包(约 38 MB)改用 LZMA 压缩到约 26 MB
才传上去(打包时用 ZIP_METHOD=lzma)。**因此 v0.2.0 的 zip 需要
7-Zip / WinRAR / PeaZip 解压 —— Windows 10 资源管理器不支持 LZMA 的 zip**;
若上限已放开,请改用默认 deflate 包(双击即可解压)。
7. 自检清单 7. 自检清单
+39 -4
View File
@@ -71,13 +71,42 @@ cp -r contracts "$STAGE/contracts"
ZIP="$OUT_DIR/$NAME.zip" ZIP="$OUT_DIR/$NAME.zip"
# 清理历史分卷,避免 old .partN 被误当成本次产物上传 # 清理历史分卷,避免 old .partN 被误当成本次产物上传
rm -f "$OUT_DIR/$NAME.zip".part* "$OUT_DIR/$NAME.zip" "$OUT_DIR/SHA256SUMS"* rm -f "$OUT_DIR/$NAME.zip".part* "$OUT_DIR/$NAME.zip" "$OUT_DIR/SHA256SUMS"*
log "生成单个完整包 $NAME.zip …"
( cd "$OUT_DIR" && zip -qr "$NAME.zip" "$NAME" ) # 压缩方式:默认 deflate(Windows 资源管理器可直接解压)。
# ZIP_METHOD=lzma 时改用 LZMA —— 包体从约 38 MB 降到约 26 MB,可绕过
# 「Gitea 站点 IIS 的 maxAllowedContentLength = 30,000,000 字节」这道闸
# (见 opendance-web/deploy/proxy/README.md 第九节)。
# **代价**:Windows 10 的资源管理器不支持 LZMA(method 14) 的 zip,用户必须用
# 7-Zip / WinRAR / PeaZip 解压(Win11 24H2+ 起资源管理器原生支持 7z/zip 变体,
# 但本项目未在 Windows 上实测)。因此只有在 IIS 上限确实无法放开时才用 LZMA。
ZIP_METHOD="${ZIP_METHOD:-deflate}"
log "生成单个完整包 $NAME.zip(压缩方式:$ZIP_METHOD)…"
case "$ZIP_METHOD" in
deflate)
( cd "$OUT_DIR" && zip -qr "$NAME.zip" "$NAME" )
;;
lzma)
command -v 7z >/dev/null 2>&1 || die "ZIP_METHOD=lzma 需要 7z(Debian/Ubuntu: apt install p7zip-full)"
( cd "$OUT_DIR" && rm -f "$NAME.zip" && 7z a -tzip -mm=LZMA -mx=9 "$NAME.zip" "$NAME" >/dev/null )
;;
*)
die "未知 ZIP_METHOD=$ZIP_METHOD(可选:deflate / lzma)"
;;
esac
# LZMA 包额外做一次完整性测试与解压自检(zip/unzip 对 method 14 支持不一致)
if [ "$ZIP_METHOD" = "lzma" ]; then
7z t "$ZIP" >/dev/null || die "LZMA 包完整性测试失败(7z t)"
log "LZMA 包完整性测试通过(7z t)"
fi
# ---- 4. 完整性自检:解压后必须含 exe + pck(同目录)且 exe 仍是合法 PE ---- # ---- 4. 完整性自检:解压后必须含 exe + pck(同目录)且 exe 仍是合法 PE ----
CHECK_DIR=$(mktemp -d) CHECK_DIR=$(mktemp -d)
trap 'rm -rf "$CHECK_DIR"' EXIT trap 'rm -rf "$CHECK_DIR"' EXIT
unzip -q "$ZIP" -d "$CHECK_DIR" if [ "$ZIP_METHOD" = "lzma" ]; then
7z x -y -o"$CHECK_DIR" "$ZIP" >/dev/null
else
unzip -q "$ZIP" -d "$CHECK_DIR"
fi
[ -f "$CHECK_DIR/$NAME/OpenDance.exe" ] || die "包内缺少 OpenDance.exe" [ -f "$CHECK_DIR/$NAME/OpenDance.exe" ] || die "包内缺少 OpenDance.exe"
[ -f "$CHECK_DIR/$NAME/OpenDance.pck" ] || die "包内缺少 OpenDance.pck(必须与 exe 同目录)" [ -f "$CHECK_DIR/$NAME/OpenDance.pck" ] || die "包内缺少 OpenDance.pck(必须与 exe 同目录)"
@@ -111,6 +140,8 @@ if [ "$SIZE_BYTES" -gt "$UPLOAD_LIMIT_BYTES" ]; then
warn " Gitea app.ini [attachment] MAX_SIZE >= 256MB" warn " Gitea app.ini [attachment] MAX_SIZE >= 256MB"
warn " nginx(若前置)client_max_body_size 256m;" warn " nginx(若前置)client_max_body_size 256m;"
warn "本脚本**不会**回退为 .partN 分卷——分卷包无法直接解压,是历史缺陷。" warn "本脚本**不会**回退为 .partN 分卷——分卷包无法直接解压,是历史缺陷。"
warn "若暂时无法放开 IIS 上限,可用 ZIP_METHOD=lzma 重跑本脚本:包体约 26 MB 可绕过 30 MB 闸,"
warn "但 Windows 10 资源管理器不能直接解压 LZMA zip,必须用 7-Zip / WinRAR(README 中已注明)。"
else else
log "低于上限,可直接作为 Release 资产上传。" log "低于上限,可直接作为 Release 资产上传。"
fi fi
@@ -125,7 +156,11 @@ else
die "sha256 自校验失败" die "sha256 自校验失败"
fi fi
echo "" echo ""
unzip -l "$ZIP" | sed -n '3,14p' if [ "$ZIP_METHOD" = "lzma" ]; then
7z l "$ZIP" | tail -14
else
unzip -l "$ZIP" | sed -n '3,14p'
fi
echo "" echo ""
echo "分发:上传 $NAME.zip 与 SHA256SUMS 两个资产;用户下载后" echo "分发:上传 $NAME.zip 与 SHA256SUMS 两个资产;用户下载后"
echo " sha256sum -c SHA256SUMS && unzip $NAME.zip 即可直接运行 OpenDance.exe。" echo " sha256sum -c SHA256SUMS && unzip $NAME.zip 即可直接运行 OpenDance.exe。"