Repository navigation
chore: package-lock.json 跟上 merchant-cli 0.10.3,并加一道版本对账 - #77
Merged
Merged
Conversation
added 2 commits
November 5, 2026 15:16
`package-lock.json` 里 `apps/merchant-cli` 的版本停在 **0.10.1**,而 package.json 已经走到 0.10.3 —— 连漏了两次: | 提交 | 版本 | 动了 lock | | --- | --- | --- | | `1d672f9` | 0.10.1 | 是 | | `1c58adb` | 0.10.2 | **没有** | | `9aabbf9` | 0.10.3 | **没有** | 漏的原因是顺序:改 `apps/merchant-cli/package.json` 的版本号本身不会碰 lock,而让 npm 把 lock 同步过去的是之后的 `npm run build` / `npm publish` —— 那两步发生在提交 之后,于是 lock 的改动落在工作区里没人管。本次这一行就是发 0.10.3 时 npm 自动写的。 lock 落后的实际后果是 `npm ci` 装出来的 workspace 版本号与源码不一致(它严格按 lock 装,不读 package.json),虽然 workspace 包的代码是本地链接、不影响行为,但对不上的 版本号会让排障时「装的是哪一版」这个问题答错。 ## 验证 五个工作区包的 lock 版本与各自 package.json 逐一比对,**全部一致**: ``` apps/admin-cli 0.4.3 apps/merchant-cli 0.10.3 apps/payment-cli 0.5.4 apps/token-cli 0.10.3 packages/cli-core 0.2.3 ``` 改动只有 1 增 1 删,仅 `apps/merchant-cli` 那一行的版本号,没有依赖树变动。
前一个提交补的是漂移本身;这个提交拦的是**让它复发的那条路**。 ## 漏的根因是顺序,不是粗心 改 `apps/<app>/package.json` 的版本号本身**不碰 lock**。真正把 lock 同步过去的是之后 的 `npm install` / `npm publish` —— 而那两步发生在**提交之后**,于是 lock 的改动落在 工作区里没人管,下一次 `git status` 才被看见。 所以靠「记得改」是拦不住的:下一次按同样顺序发版,lock 还会掉在提交之后。`npm ci` 也拦不住 —— 它查的是**依赖树**,workspace 条目的 `version` 字段对不上它并不报错。 ## scripts/check-lockfile-versions.mjs(新增) 照 `check-error-codes.mjs` 的约定写:**既可运行又可导入**。 把 lock 的 `packages` 里属于本仓 workspace 的条目(`apps/*` / `packages/*`,跳过 `node_modules/*`)逐个与对应 `package.json` 的 `version` 比对。导出 `checkLockfileVersions()` / `formatReport()` / `workspaceKeys()`,CLI 入口在一致时 退 0、有漂移退 1、lock 读不到退 2。 `formatReport` 由 CLI 与发布脚本共用,保证两处的措辞与修法提示是同一份。 两个刻意的宽松处:lock 里有、磁盘上没有的包**不算**漂移(那不是版本问题,交给 npm 自己报);没声明 `version` 的包跳过(无从对账)。 ## 两道拦截 **CI**(`.github/workflows/ci.yml`):`npm run check:lockfile` 插在 `npm ci` 之后、 `tsc` 之前 —— 这个检查很便宜,早失败就不必等 build 与 test 跑完。 **发版**(`scripts/publish-packages.mjs`):在「即将发布」清单之后、确认之前对账。 一致时打一行确认;不一致打出报告并问「仍继续发布?」,**默认中止**。 发布脚本里这道不是重复:漂移恰恰是发版动作本身造成的,所以要在动手前先把**上一轮** 的残留问出来 —— CI 只能拦住已经推上去的,拦不住本地刚攒出来的。 ## 测试 `packages/cli-core/tests/lockfile-versions.test.ts`,6 条,照 `error-codes-contract.test.ts` 的模式(含那条「防止检查空转」的断言): 1. 本仓当下没有漂移; 2. **真的在对账** —— `checked >= 5`,否则第 1 条会退化成永真; 3. 抓得到漂移,并报出两边的版本与修法; 4. 只看 `apps/*` 与 `packages/*`,不理 `node_modules/*`; 5. lock 缺失 / 非法 JSON 报 `unreadable`,不误判成「一致」; 6. lock 里有、磁盘上没有的包不算漂移。 ## 验证 - `npm test` → **1013 passed**(原 1007 + 新增 6),1 skipped; - `npm run check:lockfile` → 退 0,五个包一致; - `npm run type-check` → 退 0; - `node --check` 两个脚本均退 0,`check-lockfile-versions.mjs` 的导出可被 import (`publish-packages.mjs` 顶层直接调 `main()`,不能用 import 验,只查了语法); - 漂移分支在临时目录里实跑过:`apps/demo` lock=1.0.0 / actual=1.0.2 被正确报出。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
两个提交:一个补漂移本身,一个拦住让它复发的那条路。
提交 1 —
260fa31补上漂移package-lock.json里apps/merchant-cli的版本停在 0.10.1,而 package.json 已经走到 0.10.3 —— 连漏了两次。1d672f91c58adb9aabbf9本次这一行是发 0.10.3 时 npm 自动写进工作区的。
提交 2 —
5e20da0拦住复发漏的根因是顺序,不是粗心
改
apps/<app>/package.json的版本号本身不碰 lock。真正同步 lock 的是之后的npm install/npm publish—— 而那两步发生在提交之后,于是 lock 的改动留在工作区没人管。靠「记得改」拦不住:下一次按同样顺序发版,它还会掉在提交之后。
npm ci也拦不住 —— 它查的是依赖树,workspace 条目的version字段对不上它并不报错,然后严格按 lock 装,于是装出来的版本号与源码不符。workspace 包是本地链接,不影响运行行为,但排障时「现在装的是哪一版」会答错。scripts/check-lockfile-versions.mjs(新增)照
check-error-codes.mjs的约定写:既可运行又可导入。把 lock 的
packages里属于本仓 workspace 的条目(apps/*/packages/*,跳过node_modules/*)逐个与对应package.json的version比对。导出checkLockfileVersions()/formatReport()/workspaceKeys();CLI 入口一致退 0、有漂移退 1、lock 读不到退 2。formatReport由 CLI 与发布脚本共用,保证两处的措辞和修法提示是同一份。两个刻意的宽松处:lock 里有、磁盘上没有的包不算漂移(那不是版本问题,交给 npm 自己报);没声明
version的包跳过(无从对账)。两道拦截
CI —
npm run check:lockfile插在npm ci之后、tsc之前。这个检查很便宜,早失败就不必等 build 与 test 跑完。发版 — 在「即将发布」清单之后、确认之前对账。一致时打一行确认;不一致打出报告并问「仍继续发布?」,默认中止。
发布脚本这道不是重复:漂移恰恰是发版动作本身造成的,所以要在动手前把上一轮的残留问出来 —— CI 只能拦已经推上去的,拦不住本地刚攒出来的。
测试
packages/cli-core/tests/lockfile-versions.test.ts,6 条,照error-codes-contract.test.ts的模式(包括那条「防止检查空转」的断言):checked >= 5,否则第 1 条会退化成永真;apps/*与packages/*,不理node_modules/*;unreadable,不误判成「一致」;验证
npm testnpm run check:lockfilenpm run type-checknode --check× 2 脚本apps/demolock=1.0.0 / actual=1.0.2 被正确报出publish-packages.mjs顶层直接调main()(交互式),不能用 import 验证,所以只查了语法并单独确认了check-lockfile-versions.mjs的导出可被解析。五个工作区包的 lock 与 package.json 现已逐一对齐: