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

52 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/**/*.js``dist/**/*.d.ts`
2. 只有两个受审例外:`@qinglong/local-process` 可额外发布 `assets``@qinglong/local-sqlite` 可额外发布 `drizzle`。不得使用 `dist``dist/**` 或新增任意目录通配符。
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 文件集合。