「发布包里的东西必须等于打标签的那棵树」此前靠人抽查几个文件(README、contracts/VERSION…), 必然会漏。上一轮实测就暴露了两个认知错误:Web 的发布包其实**包含** web-server/test/** (33 个文件,我此前以为不含),以及包内另有 177 个**构建产物**(admin/、web-server/dist/) 必须与工作树构建比 —— 只比源码文件是不够的。 新增 web-server/scripts/check-tracked-release.py(纯标准库,支持 .tar.gz / .zip): 对包内**每一个**文件按路径决定比较基准 —— 构建产物(admin/、web-server/dist/)比工作树 构建结果,其余文件比 `git show <tag>:<路径>`;任何内容不一致 / 包内多余(既不在 git 也不是 声明的构建产物)/ 构建产物在工作树缺失都会列出并以非 0 退出。`npm run release:check` 已注册。 实测(**已发布**资产重新下载后跑): 包内 356 个文件:源码/文档 179(与 tag v0.7.5 比)+ 构建产物 177(与工作树构建比) ✓ 逐文件一致:0 处不一致 / 0 处多余 / 0 处缺失 反向验证:篡改 README.md 一个字节 + 塞入 web-server/EXTRA.txt → ✗ 内容不一致 1 处(README.md)、✗ 包内多余 1 处(EXTRA.txt),退出码 1。 顺带修掉脚本自身一个路径映射缺陷:BUILD_OUTPUTS 的键若是不带 / 的**精确文件名** (Windows/Android 的单文件产物),原实现会把剩余路径拼成 ".../OpenDance.exe/" 导致「工作树缺失」误报;现在区分「目录前缀」与「精确文件名」两种键。 注:accept-release.sh 的接入只在下一个版本的产物里生效(本仓 accept-release.sh 本身 也在发布包内,v0.7.5 已发布);对已发布的 v0.7.5 包仍可用 `npm run release:check -- <包> --tag v0.7.5` 逐文件核对(已跑通)。同时已把同一脚本复制到 opendance-windows / opendance-android 并接入 两端的 accept-release.sh。
59 lines
2.0 KiB
JSON
59 lines
2.0 KiB
JSON
{
|
|
"name": "opendance-web-server",
|
|
"version": "0.7.5",
|
|
"description": "OpenDance Studio Web 管理服务端(NestJS + TypeORM + 现有 MySQL 实例)",
|
|
"license": "MIT",
|
|
"private": true,
|
|
"engines": {
|
|
"node": ">=22.0.0"
|
|
},
|
|
"scripts": {
|
|
"build": "nest build",
|
|
"start": "nest start",
|
|
"start:dev": "nest start --watch",
|
|
"start:prod": "node dist/main.js",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"test:smoke": "node test/smoke.mjs",
|
|
"contracts:check": "node scripts/check-contracts.mjs && node scripts/check-routes.mjs && node scripts/check-version.mjs",
|
|
"verify": "npm run contracts:check && npm run typecheck && npm run test && npm run build && npm run bootstrap:check",
|
|
"typeorm": "node scripts/migrate.mjs",
|
|
"migration:generate": "node scripts/migrate.mjs generate",
|
|
"migration:run": "node scripts/migrate.mjs run",
|
|
"migration:revert": "node scripts/migrate.mjs revert",
|
|
"migration:show": "node scripts/migrate.mjs show",
|
|
"version:check": "node scripts/check-version.mjs",
|
|
"bootstrap:check": "node scripts/check-bootstrap.mjs",
|
|
"vectors:frame": "vite-node scripts/gen-frame-vectors.mts --",
|
|
"release:check": "python3 scripts/check-tracked-release.py"
|
|
},
|
|
"dependencies": {
|
|
"@nestjs/common": "^11.0.12",
|
|
"@nestjs/config": "^4.0.2",
|
|
"@nestjs/core": "^11.0.12",
|
|
"@nestjs/platform-express": "^11.0.12",
|
|
"@nestjs/typeorm": "^11.0.0",
|
|
"class-transformer": "^0.5.1",
|
|
"class-validator": "^0.14.1",
|
|
"dotenv": "^16.4.7",
|
|
"mysql2": "^3.12.0",
|
|
"reflect-metadata": "^0.2.2",
|
|
"rxjs": "^7.8.2",
|
|
"typeorm": "^0.3.21"
|
|
},
|
|
"devDependencies": {
|
|
"@nestjs/cli": "^11.0.5",
|
|
"@nestjs/schematics": "^11.0.2",
|
|
"@types/express": "^5.0.0",
|
|
"@types/multer": "^1.4.12",
|
|
"@types/node": "^22.13.10",
|
|
"source-map-support": "^0.5.21",
|
|
"sql.js": "^1.14.2",
|
|
"ts-node": "^10.9.2",
|
|
"tsconfig-paths": "^4.2.0",
|
|
"typescript": "^5.7.3",
|
|
"vitest": "^3.0.8"
|
|
}
|
|
}
|