
Harper VS Code 扩展本地开发指南从 just 配方到语言服务器调试的完整闭环【免费下载链接】harperOffline, privacy-first grammar checker. Fast, open-source, Rust-powered项目地址: https://gitcode.com/GitHub_Trending/har/harper本文基于 Harper 官方贡献者文档packages/web/src/routes/docs/contributors/visual-studio-code页面展开深入讲解如何在本机运行、测试并打包 Harper 的 Visual Studio Code 语法检查扩展。文中所有步骤均以仓库根目录的 justfile、扩展目录下的 .vscode 调试配置 与 扩展入口源码 为依据读完后你可以独立完成F5 运行 → 跑通测试 → 打包.vsix并安装的完整开发闭环并理解扩展与 Rust 语言服务器harper-ls之间的启动与通信机制。1. 扩展代码位置与两条关键约束Harper 的 VS Code 扩展package.json中name为harper发布者为elijah-potter当前版本 2.9.1见 package.json采用TypeScript 扩展 Rust 语言服务器的双进程架构扩展本体负责 VS Code 侧的 UI、命令与配置桥接真正的语法分析由 Rust 编写的harper-ls通过 stdio 语言服务器协议完成。官方文档给出了两条必须牢记的约束扩展代码及其测试全部位于packages/vscode-plugin/src目录绝大多数日常改动都会落在这个目录里VS Code 只能在你以packages/vscode-plugin作为工作区根目录打开时才会加载packages/vscode-plugin/.vscode下预置的 tasks 与 launch 配置。如果你打开的是 Harper 仓库根目录这些调试配置不会生效——使用调试器前必须单独用 VS Code 打开packages/vscode-plugin目录所有just配方的真实内容都可以直接查看仓库根目录的 justfile这是最权威的行为定义。从 package.json 可见扩展入口为main: ./build/extension.js即 TypeScript 源码经 esbuild 编译进build/目录后才被 VS Code 加载运行环境要求为engines: { vscode: ^1.96.2 }见 package.json开发时 VS Code 版本应满足该约束。2. 前置准备Prerequisites官方文档要求完成三项准备逐项对应到仓库中的具体实现2.1 配置开发环境并运行just setup文档指向同系列的环境准备指南 Environment 文档并要求执行just setup以确保扩展依赖安装到位。对照 justfile 可以看到setup配方实际依赖一长串构建链setup: build-harperjs test-harperjs test-vscode build-web build-wp build-obsidian build-chrome-plugin也就是说just setup会依次构建harper-wasm、harper.js及其上层包然后执行test-vscode——后者正是下文测试章节的主角它会顺带完成harper-ls的编译与packages/vscode-plugin/bin的准备。2.2 安装推荐扩展esbuild problem matchers扩展目录中的 extensions.json 声明了唯一的推荐扩展{ recommendations: [connor4312.esbuild-problem-matchers] }安装connor4312.esbuild-problem-matchers后VS Code 才能正确解析 esbuild 任务如watch:esbuild、pretest中的 esbuild 构建输出的错误并高亮到 Problems 面板。2.3 确保harper-ls位于packages/vscode-plugin/bin扩展启动语言服务器时执行的可执行文件来自bin目录。你可以手动创建该目录、编译harper-ls后放入也可以直接运行just test-vscode或just package-vscode两个配方都会自动完成这一步见下文第 4、5 节的配方剖析。3. 运行扩展Run Extension 调试配置文档给出的操作步骤是通过活动栏选择 Run and Debug 视图或按CtrlShiftD打开选择Run Extension若尚未选中点击播放Start Debugging按钮或按F5。执行后 VS Code 会打开一个全新的Extension Development Host窗口你的扩展改动即可在其中实时观察。这条Run Extension配置定义在 launch.json{ name: Run Extension, type: extensionHost, request: launch, args: [ --extensionDevelopmentPath${workspaceFolder}, --disable-extensions, ${workspaceFolder}/src/tests/fixtures ], outFiles: [${workspaceFolder}/build/**/*.js], preLaunchTask: ${defaultBuildTask} }各参数含义--extensionDevelopmentPath${workspaceFolder}把当前工作区即packages/vscode-plugin作为待开发扩展加载--disable-extensions禁用宿主窗口中的其他第三方扩展保证观察到的行为只来自 Harper 本身第三个参数直接以src/tests/fixtures目录作为初始工作区打开——该目录内置了覆盖 Rust、Python、Go、Markdown、TypeScript 等数十种语言的示例文件见 fixtures 目录方便立刻验证各语言的检查效果preLaunchTask: ${defaultBuildTask}启动前自动执行默认构建任务。对照 tasks.json默认构建任务watch依赖npm: watch:esbuild执行node esbuild.cjs --watch与npm: watch:tsc执行tsc --noEmit --watch二者均为后台任务isBackground: true分别在打开文件夹时runOn: folderOpen持续监听源码变化并增量重建build/产物。此外settings.json 关闭了typescript.tsc.autoDetect避免 VS Code 自动探测 tsc 任务与手工定义的 npm 脚本任务重复并把build目录排除在搜索之外。4. 运行测试命令行just test-vscode推荐4.1 命令行方式官方文档明确推荐命令行方式just test-vscodetest-vscode在 justfile 中的完整实现值得逐段理解它比文档描述的跑一遍测试做了更多事# Needed so pnpm install can succeed. DISABLE_WASM_OPT1 just build-harperjs ext_dir{{justfile_directory()}}/packages/vscode-plugin bin_dir${ext_dir}/bin if ! [[ -d $bin_dir ]]; then mkdir $bin_dir fi echo Building binaries cargo build --release -p harper-ls cp {{justfile_directory()}}/target/release/harper-ls* $bin_dir cd $ext_dir pnpm install # For environments without displays like CI servers or containers if [[ $(uname) Linux ]] [[ -z $DISPLAY ]]; then xvfb-run --auto-servernum pnpm test else pnpm test fi流程拆解DISABLE_WASM_OPT1 just build-harperjs先构建harper.js依赖链跳过 wasm-opt 以加快构建确保工作区依赖可用cargo build --release -p harper-ls编译语言服务器并把target/release/harper-ls*二进制拷入packages/vscode-plugin/bin——这就是第 2.3 节要求的前提进入扩展目录执行pnpm install后运行pnpm test对照 package.jsontest脚本为node build/tests/runTests.js而pretest会先执行tsc node esbuild.cjs完成编译在无显示器的 Linux 环境CI、容器中自动套上xvfb-run --auto-servernum提供虚拟显示最后清理.vscode-test目录中除最新之外的历史 VS Code 测试实例防止测试用的 VS Code 版本文件逐渐占满磁盘。测试入口 runTests.ts 基于vscode/test-electronawait runTests({ extensionDevelopmentPath: path.join(__dirname, .., ..), extensionTestsPath: path.join(__dirname, suite), launchArgs: [ --disable-extensions, path.join(__dirname, .., .., src, tests, fixtures), ], });即自动下载并启动一个隔离的 VS Code 测试实例以build/tests/suite作为测试套件路径同样禁用其他扩展并把fixtures目录作为工作区打开。测试套件位于 src/tests/suite按语言维度languages.test.ts与集成维度integration.test.ts配合fixtures/integration.md组织fixtures/languages/下则存放了 C、C、Go、Java、Python、Rust、Shell、TypeScript、Typst、Zig 等 30 余种语言的样例文件保证各语言激活与检查行为可被逐一断言。4.2 VS Code 调试器方式Test Extension文档同时给出通过调试器跑测试的步骤注意前提仍是以packages/vscode-plugin为工作区打开 VS Code打开 Run and Debug 视图活动栏或CtrlShiftD选择Test Extension点击播放按钮或按F5。对应配置见 launch.json{ name: Test Extension, type: extensionHost, request: launch, args: [ --extensionDevelopmentPath${workspaceFolder}, --extensionTestsPath${workspaceFolder}/build/tests/suite, --disable-extensions, ${workspaceFolder}/src/tests/fixtures ], outFiles: [${workspaceFolder}/build/tests/**/*.js], preLaunchTask: npm: pretest }与Run Extension的差异在于多了--extensionTestsPath${workspaceFolder}/build/tests/suite指向编译后的测试套件且preLaunchTask固定为npm: pretest即一次性执行tsc node esbuild.cjs完成编译而非进入 watch 模式。文档中特别提醒调试器模式下同样需要harper-ls已就位于packages/vscode-plugin/bin否则语言服务器无法拉起。5. 打包与安装扩展文档给出的打包/安装流程# 1. 打包扩展 just package-vscode # 2. 安装生成的 .vsix code --install-extension path/to/created/.vsixpackage-vscode配方在 justfile 中定义行为如下先把仓库根目录的LICENSE拷贝到扩展目录vsce打包要求包内携带许可证若未传入target参数本地开发默认路径执行cargo build --release -q构建 Rust 侧并确保bin目录存在后把target/release/harper-ls*拷入packages/vscode-plugin/bin若传入了target参数则假定harper-ls已经预先编译并放置好——文档注释说明这是供 CI 使用的分支在扩展目录执行pnpm install然后pnpm package对应 package.json 中的vsce package --no-dependencies--no-dependencies表明产物不打包 npm 依赖vscode:prepublish脚本会先执行tsc --noEmit node esbuild.cjs --production生成生产构建。生成的.vsix文件可用code --install-extension 路径直接装入本机 VS Code用于在真实编辑器中验证打包产物。文档另指出扩展的正式打包与分发流程由 CI 中的 Release VS Code Plugin workflow.github/workflows/release_vscode_plugin.yml负责本地配方只是其可复现版本。6. 源码纵深扩展如何拉起并桥接 harper-ls理解上面的调试/测试机制后再看 extension.ts 就能把整条链路串起来。核心实现有三块6.1 通过 vscode-languageclient 以 stdio 方式启动 harper-lslet client: LanguageClient | undefined; const serverOptions: Executable { command: , transport: TransportKind.stdio };activate()中通过getExecutablePath(context)解析bin目录下的harper-ls可执行文件并赋给serverOptions.commandextension.ts随后LanguageClient以 stdio 传输启动它。依赖列表中唯一的运行时依赖vscode-languageclientpackage.json正是这条 LSP 通道的实现。6.2 配置桥接把harper.*设置转发给语言服务器扩展声明的配置项前缀是harper而语言服务器期望的键是harper-ls。clientOptions.middleware重写了workspace/configuration请求extension.tsasync configuration(params, token, next) { const response await next(params, token); if (response instanceof ResponseError) { return response; } return [{ harper-ls: response[0].harper }]; }同时监听配置变化一旦harper下任意配置项改变就通过workspace/didChangeConfiguration通知把workspace.getConfiguration(harper)整棵树推给语言服务器extension.ts若harper.path自定义语言服务器路径变化则直接重启语言服务器。这些harper.linters.*布尔配置项数量庞大——package.json 的contributes.configuration.properties中逐条声明并由 justfile 的update-vscode-linters配方从harper-cli config输出源自harper-core的默认配置自动同步再生保证扩展设置面板与核心规则集始终一致。6.3 文档选择器与命令documentSelector不是硬编码的而是从 manifest 的activationEvents中解析onLanguage:*事件动态生成extension.ts对每种语言注册file与untitled两种 scheme唯独scminputGit 提交信息框只按语言匹配——因为它不对应磁盘文件。activationEvents覆盖了约 44 种语言见 package.json从asciidoc、c、git-commit到rust、typst、zig等与fixtures/languages/中的测试样例一一对应。扩展还注册了harper.languageserver.restart与harper.changeDialect等命令extension.ts并在中间件里对HarperAddToUserDict等词典类命令做了未保存文件untitled:URI的兜底提示。7. 关键文件速查文件作用justfiletest-vscode/package-vscode配方的权威定义含harper-ls编译、拷贝与无头环境处理launch.jsonRun Extension与Test Extension两个 extensionHost 调试配置tasks.json默认构建任务esbuild watch tsc watch 双后台任务extensions.json推荐安装connor4312.esbuild-problem-matcherspackage.json扩展元数据、44 个语言激活事件、harper.*配置项、npm 脚本test/packageextension.ts扩展入口启动harper-ls、配置桥接、命令注册runTests.tsvscode/test-electron测试入口fixtures 作为测试工作区fixtures30 余种语言的测试样例文件harper-lsRust 语言服务器被扩展以 stdio 方式拉起Environment 文档开发环境准备的前置指南8. 小结Harper VS Code 扩展的本地开发闭环可以概括为用just setup一次性准备好harper-ls二进制与前端依赖用Run Extension调试配置在隔离的 Extension Development Host 窗口中观察改动fixtures 目录提供了开箱即用的多语言验证样本用just test-vscode以 CI 相同的无头/有头路径运行vscode/test-electron集成测试最后用just package-vscode产出.vsix并以code --install-extension装入真实编辑器验证。所有配方的行为都可以直接对照 justfile 与 .vscode 目录 核实扩展与语言服务器之间的启动、配置同步逻辑则以 extension.ts 为唯一权威来源。【免费下载链接】harperOffline, privacy-first grammar checker. Fast, open-source, Rust-powered项目地址: https://gitcode.com/GitHub_Trending/har/harper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考