Angular 源码仓库 VSCode 工作区配置详解:推荐扩展、任务与 Bazel 调试链路
本篇基于 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 流程,启用方式为三步:
- 安装推荐扩展:即 extensions.json 中
recommendations数组列出的扩展; - 复制(或软链)设置:将 recommended-settings.json 复制或链接到
.vscode/settings.json; - 重启编辑器使设置生效。
如果已有自定义工作区设置,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.bazel、MODULE.bazel 及各包目录下的
BUILD.bazel),pnpm bazel系列命令在仓库中随处可见; - ms-vscode.vscode-typescript-tslint-plugin:TSLint 诊断支持,对应仓库根目录的 tslint.json 与 tools/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_modules、dist则是通用的第三方/产物排除项; - 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.yaml 即 pnpm-workspace.yaml 的packages列表包含vscode-ng-language-service,因此pnpm --filter=ng-template能精确定位到该子包; - 其
scripts.watch为ibazel build //vscode-ng-language-service/client/src //vscode-ng-language-service/server/src——即任务命令实际启动的是 iBazel(增量 Bazel),这解释了 problemMatcher 中针对iBazel [..]: Querying for files to watch与INFO: Build completed successfully两条输出的匹配正则:beginsPattern/endsPattern让 VSCode 正确判定后台任务“开始”与“单次构建完成”的边界,从而在 Problems 面板中持续呈现编译错误。
VSCE: package
{ "type": "shell", "label": "VSCE: package",
"command": "pnpm --filter=ng-template run package" }
对应子包的 scripts.package:bazel build //vscode-ng-language-service:development_package --config=release,产物位于 dist/bin/vscode-ng-language-service/development_package(main 入口指向 ../dist/bin/vscode-ng-language-service/client/src/extension.js),这一路径正是下文 Prod Client 启动配置引用的位置。
启动配置(launch.json):扩展宿主调试与 Bazel 测试调试
.vscode/launch.json(version: 0.2.0)共定义 5 个配置、2 个 compound、1 个输入项,可分为两组。
第一组:VSCE 扩展宿主调试
- VSCE: Launch Dev Client(
extensionHost类型):以当前 VSCode 作为运行时(${execPath}),参数--extensionDevelopmentPath=${workspaceFolder}/vscode-ng-language-service直接指向仓库源码目录,并preLaunchTask触发上面的 “VSCE: watch bundles”——即从源码热调试开发中的语言服务; - VSCE: Launch Prod Client:
--extensionDevelopmentPath指向dist/bin/vscode-ng-language-service/development_package(即package任务产物),preLaunchTask为 “VSCE: package”,用于调试打包后的发行形态; - VSCE: Attach to Server:
type: node的 attach 配置,port: 6009,restart: true,sourceMapPathOverrides将?:*/bin/*映射回${workspaceFolder}/*,配合skipFiles/resolveSourceMapLocations跳过node_modules——用于连接语言服务的 Node 服务端进程。
Compound 配置 “VSCE: Dev Client + Attach to Server” 把 1 与 3 组合启动,实现客户端(扩展进程)与服务端(语言服务器进程)同时可断点调试。
第二组:Bazel Node 测试调试
- DEBUG: Attach to bazel test:
port: 9229、timeout: 600000(10 分钟等待连接),同样是 node attach + sourceMap 映射回工作区; - DEBUG: Run bazel test (Custom Target):
type: node的 launch 配置,runtimeExecutable: "pnpm",runtimeArgs: ["bazel", "test", "${input:bazelTarget}", "--config=debug"],在集成终端中以${workspaceFolder}为 cwd 运行; - 输入项
bazelTarget为promptString类型,启动时提示输入目标,示例与默认值均为//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=debug的pnpm bazel test组合,调试任意 Bazel Node 测试目标,细节可与 contributing-docs/building-with-bazel.md 互参。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00