Files
qinglong/docs/adr/ADR-0090-production-package-packlist-and-map-exclusion.md

4.6 KiB
Raw Permalink Blame History

ADR-0090Production Package Packlist 与开发 Map 排除

  • 状态:AcceptedADR-0106 后 23 个 QL3 importer 与六种 Profile 制品已执行)
  • 日期:2026-07-22
  • 关联 RFCQL-RFC-0001 D-05、D-14、D-35、D-40、D-62、D-85、D-86、D-89
  • 关联 ADRADR-0038、ADR-0040、ADR-0062、ADR-0063、ADR-0087、ADR-0088、ADR-0089

上下文

QL3 package 的 TypeScript 开发构建生成 .js.d.ts.js.map.d.ts.map。此前每个 package.json 使用宽泛的 files: ["dist"],所以 pnpm pack 会把四类文件全部装入 production artifact。ADR-0089 增加四个常驻 TypeScript 单元后,最大 application 虽仍低于 4 MiB/512 files/16 MiB 门禁,但已达到 2,450,553 bytes、505 files、60 loaded modules,只余 7 个文件预算。

这些 map 有开发调试价值,但 Node 运行和 package 间 TypeScript 类型解析分别只需要 .js.d.ts。在开发构建中关闭 source map 会损害本地调试;在制品审计中直接忽略 map 又会让报告与用户实际安装内容不一致。

决策

  1. 所有当前 23 个 QL3 package 继续在开发 dist 生成 source/declaration map,但 production files 精确白名单固定为 dist/**/*.jsdist/**/*.d.ts
  2. 只有两个受审例外:@qinglong/local-process 可额外发布 assets@qinglong/local-sqlite 可额外发布 drizzle。不得使用 distdist/** 或新增任意目录通配符。
  3. package dependency audit 对每个已登记 importer 比较完整、有序的 files 数组;缺少 JS/声明、重新加入宽泛 dist、增加未审资产或新增 importer 未登记全部 fail closed。
  4. Profile artifact audit 继续按真实流程执行:逐包 build、pnpm pack、offline production install、精确 package 集合、文件/字节预算和 Node import closure/RSS。不得在安装后删除 map 或从计数器中排除文件。
  5. 该规则只改变发布内容,不改变开发 dist、package exports、运行模块或依赖树。若未来要发布 ESM、WASM、native binary、schema 或 UI asset,必须显式增加对应 package 的窄白名单和制品测试。

被否决的替代方案

  1. 把文件门禁从 512 调高:掩盖无运行价值文件进入路由器制品,拒绝。
  2. 全局关闭 TypeScript source/declaration map:降低本地调试与声明定位能力,拒绝。
  3. 制品审计安装后删除 map:报告与用户收到的 package 不一致,拒绝。
  4. 只发布 .js:内部 package 的类型消费者和独立安装检查会失去声明契约,拒绝。
  5. 使用负 glob 排除 map:宽泛正向目录仍可能带入未来未知文件;精确正向白名单更易审计,拒绝。

影响与证据

  • runtime-core 的实际 tarball 检查得到 39 个 JS、39 个 .d.ts、0 个 map,并保留根 export target。
  • 当前 23 个 package manifest 全部通过 QL3_PACKAGE_PRODUCTION_FILES_INVALID fail-closed 审计,专用 contract test 覆盖默认及两个资产例外。
  • 六种真实 production artifact 全部通过;更新后数据为:
Profile Bytes Files Loaded modules RSS delta sample
edge 1,303,217 192 30 6,782,976
standalone 1,303,343 192 30 6,176,768
edge-adopted 1,378,389 202 33 7,962,624
standalone-adopted 1,378,560 202 33 8,699,904
edge-application 1,666,316 263 60 11,730,944
standalone-application 1,666,424 263 60 11,730,944

最大制品相对变更前减少 784,129 bytes 和 242 filesloaded modules 保持 60,证明优化来自发布元数据排除而不是删除运行能力。RSS 是本机单次抽样,只用于硬门禁,不作跨次性能提升结论。

ADR-0106 收敛四个 Profile wrapper 后,制品入口改为 local-profile/local-adopted-profile 精确 subpath。叠加后续 Scheduler 能力的当前快照为:edge/standalone 1,662,386/1,662,434 bytes、238 files、37 modulesedge-adopted/standalone-adopted 1,898,370/1,898,442 bytes、266 files、40 modulesedge-application/standalone-application 2,211,411/2,211,531 bytes、337 files、70 modules。六种制品继续低于原门禁;不同切片的 RSS/bytes 不用于推导单一优化收益。

后续约束

新 package 或新静态资产必须先进入 importer registry 和 packlist audit;不能把本 ADR 当作重新拆细 package 的理由。package 粒度仍由 ADR-0087 决定。最终 Docker/系统包还应验证解包后的 owner/mode、license/SBOM、签名和 release archive digest;本 ADR 只收敛 workspace package 的 production 文件集合。