Skip to content

build(Deps): 5 项开发依赖一次性收编合入——vitest 5 / vsce 4 / ovsx 1.2 / ts-eslint 8.70 / esbuild 0.28.2 - #132

Merged
ThreeFish-AI merged 7 commits into
feature/1.x.xfrom
ThreeFish-AI/rebase-prs-to-1.x.x
Sep 21, 2026
Merged

ThreeFish-AI merged 7 commits into
feature/1.x.xfrom
ThreeFish-AI/rebase-prs-to-1.x.x

Conversation

@ThreeFish-AI

@ThreeFish-AI ThreeFish-AI commented Sep 21, 2026

Copy link
Copy Markdown
Owner

背景

dependabot 当前有 5 个 open PR(#127#131),全部已正确打向 feature/1.x.x(PR #75 锚定 target-branch 的成果),基线无需切换。但五者全部只改 package.json + pnpm-lock.yaml——@vscode/vsceesbuild 在 devDependencies 中是相邻行,lockfile 更是全文冲突。逐个点 Merge 意味着:合入任意一个,其余 4 个立刻变 CONFLICTING,需逐个 @dependabot rebase 并重跑整轮 CI,共 5 轮串行。

本 PR 按 #75 确立的范式,把五项升级合并为单个 PR 只重生一次 lockfile,并修复根因避免每周复发。

依赖升级

依赖 变更 性质 原 PR
@vscode/vsce 3.9.2 → 4.0.0 major #131
vitest 4.1.10 → 5.0.1 major #127
ovsx 1.1.1 → 1.2.0 minor #130
typescript-eslint 8.68.0 → 8.70.0 minor #129
esbuild 0.28.1 → 0.28.2 patch #128

两项 major 都把 Node 基线抬至 22(vitest 5 的实际下界 ^22.12.0 是全集最紧的一条),与 CI 四个 job 的 node-version: 22 一致。

lockfile 漂移审计:新旧 lockfile 的包条目集合逐项比对,675 条中的全部增删均可溯源至这五项升级及其传递闭包——vitest 5 把 @vitest/expect|runner|snapshot|utils|pretty-format 内联进主包,vsce 4 换入 marked@18 + parse5@8 + @azure/identity@4.13.3(替下 markdown-it + cheerio)。未改 spec 的 eslint / typescript / vite / prettier / mocha / @types/node / @stylistic/eslint-plugin 版本零变化

pnpm-workspace.yaml 维持不变allowBuilds@vscode/vsce-sign / esbuild / keytar 三项一个都不能删——ovsx@1.2.0 仍声明 @vscode/vsce: ^3.7.1,vsce 3.9.2 连同其 keytar@7.9.0 optionalDep 继续在树中,@vscode/vsce-sign 现为 2.0.9 / 2.1.0 双版本。删任一项即重现 issue.md #2ERR_PNPM_IGNORED_BUILDS

合并方式

#75 的一处差异:本 PR 的分支以 git merge -s ours 额外收编了五个 dependabot PR 的 head commit(c6c40fb b1d4648 bc01176 8ef36c5 ef6c9c1),产出一个 6-parent 的血缘登记提交,工作树与前一提交完全一致(树以一次性重生的 lockfile 为准)。

这样做的唯一目的:让五个 PR 的 head commit 成为 feature/1.x.x 的祖先,合并后由 GitHub 自动标记为 Merged 而非 Closed——#75 未携带 dependabot commit,其取代的 4 个 PR 最终都是 CLOSED

因此本 PR 必须以 merge commit 落地gh pr merge --merge)。squash 会重写 SHA,血缘断裂,五个 PR 会退化为 Closed。

根因修复

.github/dependabot.yml 此前无 groups 配置,每个依赖各开一个 PR,且 open-pull-requests-limit: 5 已被打满——这正是本次要手工合并 5 个共改 lockfile 的 PR 的根因。本 PR 为两个 ecosystem 补上分组:

  • npm:开发依赖的 minor/patch 聚合为单个 PR(dependency-type: development + update-types: [minor, patch])。major 刻意不入组,仍逐项单开——本次两个 major 各自带来 Node 基线抬升与打包管线换引擎,正说明这个评估与回滚粒度有价值。
  • github-actions:全量聚合(patterns: ['*'])。爆炸半径限于 CI 工作流本身,且 major 升级属例行(checkout 4→7、setup-node v6→v7),单开只会制造同类噪声。

既有的 ignore@types/vscodetypescript major)与 open-pull-requests-limit: 5 保持不变。

验证

本地(Node 24.14.0 / pnpm 12.2.1,与 packageManager 字段一致):

  • pnpm install:无 ERR_PNPM_IGNORED_BUILDS@vscode/vsce-sign 的 postinstall 正常执行;pnpm-workspace.yaml 未进 diff。
  • pnpm run check-typestsc --noEmit)零错误。
  • pnpm run lint(eslint 10.9.1 + typescript-eslint 8.70.0 + @Stylistic 5.10.0)零错误。
  • pnpm run package(check-types + lint + esbuild 0.28.2 --production)产出 dist/extension.js 252 KB。
  • pnpm run test:unit(vitest 5.0.1):46 文件 / 429 用例全通过(4.93s)。其中含 3 处 vi.mock('vscode', factory)branch-favorites / changelist-registry / commit-service)——vscode 无 on-disk 实体、依赖 mocker 拦截裸 specifier,而 vitest 5 重写了 @vitest/mocker,这是本次升级最可能踩的点,实测无碍。
  • pnpm run test:integration@vscode/test-electron 拉起真实 VS Code 1.138.0 + mocha):主 suite 8 passing (26s)、多根工作区 suite 4 passing,进程退出码 0。
  • vsce 4.0.0 打包回归(针对 glob@13 → tinyglobbymarkdown-it + cheerio → marked@18 + parse5@8 两处换引擎):vsce ls 文件集合 17 项与升级前完全一致(唯一差异是遍历顺序);vsce package 产出 VSIX 19 项内容清单一致、1.46 MB;解包后的 extension/README.md 与升级前逐字节相同——README 中 <picture>/<source srcset> 与相对文档链接的重写行为无回归。
  • ⏭ macOS / Windows 矩阵仅在 push 到 feature/1.x.x 后触发;vsce 4.0.0 新增的「legacy PAT 凭证迁移提示」只在 v* tag 的 publish job 路径生效,本 PR 的 CI 覆盖不到,留待下一个 tag 验证。

权威:本 PR 的 GitHub Actions CI(on: pull_request)在 feature/1.x.x 基线上运行 Lint & Build / Test (ubuntu-latest) / Package vsix,以 Node 22 验证五项升级的组合兼容性。

取代

本 PR 收编以下 dependabot PR,合并后将由 GitHub 自动标记为 Merged:

🤖 Generated with Claude Code

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com

dependabot Bot and others added 7 commits September 19, 2026 06:32
Bumps [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) from 4.1.10 to 5.0.1.
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.1/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [esbuild](https://github.com/evanw/esbuild) from 0.28.1 to 0.28.2.
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](evanw/esbuild@v0.28.1...v0.28.2)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.68.0 to 8.70.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.70.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.70.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [ovsx](https://github.com/eclipse-openvsx/openvsx/tree/HEAD/cli) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/eclipse-openvsx/openvsx/releases)
- [Changelog](https://github.com/eclipse-openvsx/openvsx/blob/main/cli/CHANGELOG.md)
- [Commits](https://github.com/eclipse-openvsx/openvsx/commits/v1.2.0/cli)

---
updated-dependencies:
- dependency-name: ovsx
  dependency-version: 1.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps [@vscode/vsce](https://github.com/Microsoft/vsce) from 3.9.2 to 4.0.0.
- [Release notes](https://github.com/Microsoft/vsce/releases)
- [Commits](microsoft/vscode-vsce@v3.9.2...v4.0.0)

---
updated-dependencies:
- dependency-name: "@vscode/vsce"
  dependency-version: 4.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
….70 / esbuild 0.28.2;

- 收编 dependabot #127 #128 #129 #130 #131 五个 PR:`@vscode/vsce` 3.9.2 → 4.0.0、`vitest` 4.1.10 → 5.0.1(两项 major)、`ovsx` 1.1.1 → 1.2.0、`typescript-eslint` 8.68.0 → 8.70.0、`esbuild` 0.28.1 → 0.28.2;五者共改 pnpm-lock.yaml,顺序合并必连环冲突,故合成单个 PR 只重生一次 lockfile;两项 major 均把 Node 基线抬至 22(vitest 5 的 `^22.12.0` 是全集最紧下界),与 CI 四个 job 的 `node-version: 22` 一致;
- lockfile 漂移审计:675 条包目录的全部增删可溯源至五项升级及其传递闭包(vitest 5 将 @vitest/expect|runner|snapshot|utils|pretty-format 内联进主包,vsce 4 以 marked@18 + parse5@8 + @azure/identity@4.13.3 替下 markdown-it + cheerio),未改 spec 的 eslint / typescript / vite / prettier / mocha / @types/node / @stylistic/eslint-plugin 版本零变化;
- `pnpm-workspace.yaml` 的 allowBuilds 三项维持不变:ovsx@1.2.0 仍传递依赖 @vscode/vsce@^3.7.1,keytar@7.9.0 与 @vscode/vsce-sign(现 2.0.9 / 2.1.0 双版本)继续在依赖树中,删任一项即重现 issue.md #2 的 ERR_PNPM_IGNORED_BUILDS;
- `.github/dependabot.yml` 补 groups 修根因(此前无分组且 open-pull-requests-limit: 5 已打满,正是每周多个 deps PR 共改 lockfile 的来源):npm 的开发依赖 minor/patch 聚合为单 PR,major 仍逐项单开以保留逐个评估与回滚的粒度;github-actions 全量聚合(爆炸半径限于工作流本身,major 升级属例行);既有 ignore 与 limit 不变;
- CHANGELOG `[Unreleased]` 新增 ### Build 两条。

验证: check-types、lint、package(tsc + eslint + esbuild --production)、test:unit(46 文件 / 429 用例)、test:integration(主 suite 8 项 + 多根 suite 4 项,VS Code 1.138.0)全绿;vsce 4 打包回归实测——`vsce ls` 文件集合 17 项与升级前完全一致(差异仅 glob@13 → tinyglobby 的遍历顺序),VSIX 内容清单 19 项一致,打包后 README 与升级前逐字节相同(marked + parse5 的相对链接/图片重写行为无回归)。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
以 -s ours 策略仅登记血缘、不改动工作树——五项升级与 pnpm-lock.yaml 已在前一提交中
一次性重生收口(五个 PR 共改 lockfile,顺序合并必连环冲突,须逐个 @dependabot rebase
并重跑整轮 CI)。本合并使五个 PR 的 head commit 成为 feature/1.x.x 的祖先,合并后由
GitHub 自动标记为 Merged 而非 Closed——PR #75 未携带 dependabot commit,其取代的 4 个
PR 最终都是 CLOSED。

因此本 PR 必须以 merge commit 落地(gh pr merge --merge):squash 会重写 SHA、血缘断裂,
五个 PR 将退化为 Closed。

🤖 Generated with [Claude Code](https://github.com/claude), [CodeX](https://openai.com), [Gemini](https://github.com/apps/gemini-code-assist)
Co-Authored-By: Aurelius Huang<threefish.ai@gmail.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant