# Phase 2:拆仓库 父任务:`.trellis/tasks/08-25-road-compiler-extraction/` 技术设计:父任务 `design.md` §1.3(消费方式)、§2(模块清单) ## Goal 把 `packages/road-compiler/` 拆成保留 git 历史的独立仓库, 宿主改为锁版本依赖 + 子进程调用消费。 ## Requirements ### R2.1 保留 git 历史 🔴 - 用 `git subtree split` 或 `git filter-repo` 拆出,**不得**用 `cp` + `git init` - 理由(父任务 R3.2):1695 行几何逻辑的 blame 是踩坑记录, 丢了以后没人敢改 `compileGeometry` 里任何一行 - 验证:新仓库内 `git log --follow src/compile/native-road.js` 能看到 08-13 native-road-compiler 以来的完整历史 ### R2.2 子进程为主契约 - 宿主 `build-area.js` 改为 `execFileSync` 调编译器 CLI, 解析 `NATIVE_ROAD_COMPILE_DONE` stdout 标记(父任务 design §1.3) - in-process `require` 可保留为可选优化路径,但不得是唯一路径 - 与既有 QGIS / GDAL / Blender 调用方式一致 (见 `.trellis/spec/pipeline/external-tools.md`) ### R2.3 锁版本依赖 - 开发期:`file:` 或 workspace 依赖 - 稳定后:git tag / 私有 npm,宿主 `package.json` **锁具体版本,不用 `latest`** - 契约版本 `native-road-package/v1` 与包版本分开演进: 包可以发 patch,契约版本只在破坏性变更时升 ### R2.4 K4:workbench 依赖自持 - `road-workbench` 的 OpenLayers 从新仓库自己的 `node_modules` 提供 - import map 路径相应调整 ### R2.5 基线迁移 - Phase 0 的三区域基线 JSON 搬进新仓库当测试语料(父任务 R4 第三条) - 新仓库 CI/test 能独立跑 parity,无需宿主在场 - **同时**宿主保留一份,用于验证升级编译器版本后产物未变 ### R2.6 契约文档迁移 - `docs/native-road-package-v1.md` 搬进新仓库 - 宿主 `.trellis/spec/pipeline/` 留指针,说明契约由编译器仓库拥有 ## Acceptance Criteria - [ ] AC2.1 新仓库 `git log --follow` 能追到搬迁前的历史 - [ ] AC2.2 新仓库 `npm test` 在**未 clone 宿主**的机器上通过 - [ ] AC2.3 宿主从锁版本依赖构建,三区域 parity 对基线全绿 - [ ] AC2.4 `build-area.js` 走子进程路径,`NATIVE_ROAD_COMPILE_DONE` 被正确解析 - [ ] AC2.5 宿主 `package.json` 依赖为具体版本,非 `latest` / 非 `*` - [ ] AC2.6 编译器仓库对宿主反向依赖数为 0(父任务 AC8,grep 验证) - [ ] AC2.7 `npm run road:workbench` 在新仓库内独立可跑 ## 依赖与顺序 - **前置**:Phase 1 完成且 AC1.1–AC1.8 全绿 - **阻塞**:Phase 3、Phase 4 ## 待决策(进入本阶段时定) | 项 | 选项 | |---|---| | 仓库名 | `road-compiler` / `native-road-compiler` / `osm-road-compiler` | | 托管 | GitHub 私有 / 公开 / 内部 git | | 分发 | git tag 依赖 / 私有 npm registry | | 宿主过渡期 | 是否保留 `packages/road-compiler/` 一段时间做双跑对照 | ## Out of Scope - layer manifest(Phase 3) - drawtonomy 扩展(Phase 4) - 任何编译器内部逻辑改动 —— 本阶段代码内容不变,只换位置与消费方式