首页
/ Angular 源码仓库 VSCode 工作区配置详解:推荐扩展、任务与 Bazel 调试链路

Angular 源码仓库 VSCode 工作区配置详解:推荐扩展、任务与 Bazel 调试链路

2026-09-05 20:26:52作者:彭桢灵Jeremy

本篇基于 Angular 仓库的 .vscode/README.md 导读,完整拆解该目录下的推荐扩展清单、工作区设置、构建任务与调试启动配置,并结合 vscode-ng-language-service/package.json 等源码印证各配置的实际作用,帮助你在打开 Angular 源码仓库时快速搭建起 Angular 团队推荐的开发环境。

.vscode 目录的内容与定位

.vscode/README.md 说明,该目录存放的是 Angular 团队针对本仓库推荐的、需开发者手动选择启用(opt-in)的一组 VSCode 配置,包括:

文件 类型 作用
extensions.json 扩展推荐 工作区推荐安装的 VSCode 扩展
recommended-settings.json 工作区设置 推荐合并到 settings.json 的编辑器设置
tasks.json 任务 语言服务扩展的 watch/package 构建任务
launch.json 启动配置 扩展宿主调试与 Bazel 测试调试

关键点在于这些配置不会自动生效:README 明确指出这不是一个自动流程,因此当推荐设置更新时,需要开发者重新执行合并操作。

使用步骤:启用推荐配置

按照 .vscode/README.md 给出的 Usage 流程,启用方式为三步:

  1. 安装推荐扩展:即 extensions.jsonrecommendations 数组列出的扩展;
  2. 复制(或软链)设置:将 recommended-settings.json 复制或链接到 .vscode/settings.json
  3. 重启编辑器使设置生效。

如果已有自定义工作区设置,README 建议不要直接覆盖,而是手动合并文件内容。再次强调,由于该流程不是自动的,推荐设置每次更新后都需要重新执行上述合并。

查看推荐扩展的方式:打开命令面板(Command Palette),执行 Extensions: Show Recommended Extensions 命令即可列出工作区推荐项。

推荐扩展清单(extensions.json)

.vscode/extensions.json 采用 ${publisher}.${name} 的标识符格式(注释中引用了 VSCode 官方工作区推荐机制说明),当前推荐了两个扩展:

{
  // 扩展标识符格式:${publisher}.${name},例如 vscode.csharp
  "recommendations": [
    "BazelBuild.vscode-bazel",
    "ms-vscode.vscode-typescript-tslint-plugin",
  ]
}
  • BazelBuild.vscode-bazel:Bazel 构建系统支持。整个仓库以 Bazel 为主要构建系统(见 BUILD.bazelMODULE.bazel 及各包目录下的 BUILD.bazel),pnpm bazel 系列命令在仓库中随处可见;
  • ms-vscode.vscode-typescript-tslint-plugin:TSLint 诊断支持,对应仓库根目录的 tslint.jsontools/tslint/ 下的自定义规则(如 noDuplicateEnumValuesRule.ts)。

推荐设置详解(recommended-settings.json)

.vscode/recommended-settings.json 全部条目如下,逐条说明其在本仓库的意义:

{
  "[javascript]": { "editor.formatOnSave": true },   // JS 文件保存时自动格式化
  "[typescript]": { "editor.formatOnSave": true },   // TS 文件保存时自动格式化

  // 将第三方模块与构建产物排除在编辑器监视/搜索之外
  "files.watcherExclude": {
    "**/.git/objects/**": true,
    "**/.git/subtree-cache/**": true,
    "**/node_modules/**": true,
    "**/bazel-out/**": true,   // Bazel 输出树,构建产物体积大
    "**/dist/**": true
  },
  "search.exclude": {
    "**/node_modules": true,
    "**/bower_components": true,
    "**/bazel-out": true,      // 全局搜索不进入 Bazel 产物
    "**/dist": true,
    ".history": true
  },
  "git.ignoreLimitWarning": true,   // 大仓库 git 状态扫描超过上限时不再告警
  // GitLens:blame 时忽略 .git-blame-ignore-revs 中列出的提交
  "gitlens.advanced.blame.customArguments": ["--ignore-revs-file .git-blame-ignore-revs"]
}

几个值得注意的设计细节:

  • 按语言作用域启用格式化:通过 [javascript][typescript] 语言键只为 JS/TS 开启 editor.formatOnSave,不影响其他文件类型;
  • 排除 bazel-out 是仓库特定项:该目录是 Bazel 的构建输出树,若不排除会导致文件监视与全局搜索性能显著劣化。node_modulesdist 则是通用的第三方/产物排除项;
  • GitLens 的 --ignore-revs-file:指向仓库根目录实际存在的 .git-blame-ignore-revs 文件(约 1.9 KB),用于在 blame 视图中跳过格式化等“噪音”提交,让代码归属更贴近真实作者。

构建任务(tasks.json):语言服务扩展的 watch 与打包

.vscode/tasks.json 定义了两个围绕仓库内 Angular 语言服务(VSCode 扩展)的任务:

VSCE: watch bundles(默认构建任务)

{
  "type": "shell",
  "label": "VSCE: watch bundles",
  "command": "pnpm --filter=ng-template run watch",
  "isBackground": true,                 // 后台任务,持续运行不阻塞终端
  "group": { "kind": "build", "isDefault": true },
  "presentation": { "panel": "dedicated", "reveal": "never" },
  "problemMatcher": {
    "base": "$tsc-watch",
    "background": {
      "activeOnStart": true,
      // 以下两条正则用于识别 iBazel 的“开始监视/构建完成”阶段
      "beginsPattern": "^iBazel \\[\\d{1,2}:\\d{1,2}(?:AM|PM)\\]: Querying for files to watch.*",
      "endsPattern": "^INFO: Build completed successfully, \\d+ total action(s)?"
    }
  }
}

这里的实现证据可以直接对应到 vscode-ng-language-service/package.json

  • 该包 "name": "ng-template"displayName 为 “Angular Language Service”,"version": "22.1.0"pnpm-workspace.yamlpnpm-workspace.yamlpackages 列表包含 vscode-ng-language-service,因此 pnpm --filter=ng-template 能精确定位到该子包;
  • scripts.watchibazel build //vscode-ng-language-service/client/src //vscode-ng-language-service/server/src——即任务命令实际启动的是 iBazel(增量 Bazel),这解释了 problemMatcher 中针对 iBazel [..]: Querying for files to watchINFO: Build completed successfully 两条输出的匹配正则:beginsPattern/endsPattern 让 VSCode 正确判定后台任务“开始”与“单次构建完成”的边界,从而在 Problems 面板中持续呈现编译错误。

VSCE: package

{ "type": "shell", "label": "VSCE: package",
  "command": "pnpm --filter=ng-template run package" }

对应子包的 scripts.packagebazel build //vscode-ng-language-service:development_package --config=release,产物位于 dist/bin/vscode-ng-language-service/development_packagemain 入口指向 ../dist/bin/vscode-ng-language-service/client/src/extension.js),这一路径正是下文 Prod Client 启动配置引用的位置。

启动配置(launch.json):扩展宿主调试与 Bazel 测试调试

.vscode/launch.jsonversion: 0.2.0)共定义 5 个配置、2 个 compound、1 个输入项,可分为两组。

第一组:VSCE 扩展宿主调试

  1. VSCE: Launch Dev ClientextensionHost 类型):以当前 VSCode 作为运行时(${execPath}),参数 --extensionDevelopmentPath=${workspaceFolder}/vscode-ng-language-service 直接指向仓库源码目录,并 preLaunchTask 触发上面的 “VSCE: watch bundles”——即从源码热调试开发中的语言服务;
  2. VSCE: Launch Prod Client--extensionDevelopmentPath 指向 dist/bin/vscode-ng-language-service/development_package(即 package 任务产物),preLaunchTask 为 “VSCE: package”,用于调试打包后的发行形态;
  3. VSCE: Attach to Servertype: node 的 attach 配置,port: 6009restart: truesourceMapPathOverrides?:*/bin/* 映射回 ${workspaceFolder}/*,配合 skipFiles/resolveSourceMapLocations 跳过 node_modules——用于连接语言服务的 Node 服务端进程。

Compound 配置 “VSCE: Dev Client + Attach to Server” 把 1 与 3 组合启动,实现客户端(扩展进程)与服务端(语言服务器进程)同时可断点调试。

第二组:Bazel Node 测试调试

  1. DEBUG: Attach to bazel testport: 9229timeout: 600000(10 分钟等待连接),同样是 node attach + sourceMap 映射回工作区;
  2. DEBUG: Run bazel test (Custom Target)type: node 的 launch 配置,runtimeExecutable: "pnpm"runtimeArgs: ["bazel", "test", "${input:bazelTarget}", "--config=debug"],在集成终端中以 ${workspaceFolder} 为 cwd 运行;
  3. 输入项 bazelTargetpromptString 类型,启动时提示输入目标,示例与默认值均为 //packages/...

Compound “DEBUG: Run bazel test (Custom Target) + Attach” 将两者组合:先以 --config=debug 拉起测试(进程会挂起等待调试器),再由 9229 端口的 attach 配置接管。这套 9229 端口 + 源码映射参数与官方贡献文档 contributing-docs/building-with-bazel.md 中 “Debugging a Node Test in VSCode” 一节给出的 attach 配置完全一致(该文档同时说明调试流程:在代码中放置断点或 debugger 语句后运行 pnpm bazel test <target> --config=debug,Bazel 会等待连接,然后在调试视图点击绿色运行按钮附加到进程)。

修改推荐配置的约定

.vscode/README.md 末尾还专门约束了对 recommended-*.json 文件的修改原则:

  • 这些文件会被仓库的许多使用者共用,任何修改都会影响他人;
  • 应只保留有助于开发流程的设置与配置,尽量避免改变用户既有工作流(avoid altering the user workflow whenever possible)。

这条约定也解释了为何推荐设置刻意保守:只覆盖格式化、监视/搜索排除、git 告警与 blame 过滤这类“无侵入”的项,而把扩展调试这类强工作流相关的配置放在任务与 launch 文件中由用户按需触发。

小结

  • 启用流程:安装 extensions.json 推荐扩展 → 将 recommended-settings.json 复制/合并为 .vscode/settings.json → 重启编辑器;设置更新后需重复执行;
  • 日常体验项:JS/TS 保存即格式化、bazel-out/node_modules/dist 的监视与搜索排除、GitLens 忽略 .git-blame-ignore-revs 中的提交;
  • 语言服务开发项:通过 tasks.json 的 watch/package 任务 + launch.json 的 Dev/Prod Client 与 6009 端口 attach 完成扩展宿主与语言服务器的联调;
  • 测试调试项:通过 9229 端口 attach 与 --config=debugpnpm bazel test 组合,调试任意 Bazel Node 测试目标,细节可与 contributing-docs/building-with-bazel.md 互参。
登录后查看全文
热门项目推荐
相关项目推荐