ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

vscode-cats 插件开发实战:从 command 到配置文件的完整实现

vscode-cats 插件开发实战:从 command 到配置文件的完整实现 1. 从零跑通 vscode-cats一个能注册 command 的插件骨架vscode-cats 是一个把猫咪形象挂进 VSCode 工作区的插件它最核心的能力其实只有两件事注册一个可被命令面板调用的 command以及读取用户在 settings.json 里写的配置项。听起来简单但真正动手时你会发现VSCode 插件开发的门槛不在 TypeScript 语法而在 package.json 的声明式配置和 extension.ts 的激活时机——这两个文件没对齐命令就永远点不出来。这篇内容适合两类人一是想给团队做内部工具、需要把某个脚本挂到命令面板的开发者二是想拿一个真实小插件练手、理解 VSCode 扩展生命周期的人。我会用 vscode-cats 作为案例把 command 注册、配置贡献点、激活事件、以及通过 TaoToken 统一 Key/API 通道接入模型能力的完整链路走一遍。你跟着做最后能拿到一个可运行、可调试、可打包的插件 demo。需要提前说明的是vscode-cats 本身是一个视觉类插件但它的工程结构非常典型任何“命令 配置 网络请求”型插件都能套用。所以我会在保留猫咪配置项的同时额外加一条通过 TaoToken 调用模型对话的命令让这个 demo 不只是花架子。2. 前置准备环境、TaoToken Key 与项目初始化2.1 安装脚手架与依赖VSCode 插件官方推荐用 Yeoman 生成器起步避免手写 package.json 时漏字段。打开终端执行npm install -g yo npm install -g generator-code如果你之前装过旧版本建议先npm uninstall -g generator-code再重装否则yo code可能报模板缺失。装完后进入你想放项目的目录执行yo code交互式界面里选择New Extension (TypeScript)然后依次填写插件名比如vscode-cats-demo、标识符、描述。生成器会自动跑npm install等它结束你会得到一个标准目录├── CHANGELOG.md ├── README.md ├── src │ └── extension.ts ├── package.json ├── tsconfig.json └── test2.2 通过 TaoToken 准备统一 Keyvscode-cats 的猫咪渲染是纯本地逻辑但我们要加的那条“问猫咪”命令需要调用模型。这里用 TaoToken 作为统一通道好处是 Key 和 API 地址集中管理后面换模型只改配置不改代码。先到官网注册并进入控制台在 API Keys 页面创建一个新 Key。地址如下官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI Keys 管理https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content创建后把 Key 复制出来先放在环境变量里不要直接写进代码提交到仓库。API 基础地址是https://taotoken.net/api注意这个地址不带任何查询参数拼接路径时用/v1/chat/completions这类标准 OpenAI 兼容格式即可。注意Key 属于敏感凭证插件里读取时优先走vscode.workspace.getConfiguration或context.secrets不要硬编码在 extension.ts 里。3. 可复制配置package.json 与 settings.json 骨架3.1 package.json 的 activationEvents 与 contributespackage.json 是插件的“身份证 菜单”VSCode 靠它知道什么时候激活你、命令叫什么、配置项长什么样。先看激活事件。demo 默认是onCommand只有用户点了命令才激活activationEvents: [ onCommand:vscode-cats.hello, onCommand:vscode-cats.ask ]如果你希望插件一启动就加载比如猫咪要常驻可以改成*但代价是拖慢 VSCode 冷启动。vscode-cats 原版用的就是*因为它需要在窗口打开时就把猫咪注入进去。我的建议是纯命令型插件用onCommand视觉常驻型才用*。接着是contributes.commands这里注册的命令必须和 activationEvents 里的onCommand:后缀完全一致大小写都不能错contributes: { commands: [ { command: vscode-cats.hello, title: Cats: 打个招呼 }, { command: vscode-cats.ask, title: Cats: 问猫咪一个问题 } ] }然后是contributes.configuration它决定了 settings.json 里能写什么、UI 设置页显示什么。vscode-cats 原版的配置项包括 enabled、model、modelWidth、modelHeight、moveX、moveY、opacity、position。我保留其中几个再加一个vscode-cats.apiKey用于 TaoTokenconfiguration: { title: 喵咪配置, type: object, properties: { vscode-cats.enabled: { type: boolean, default: true, description: 是否启用喵咪 }, vscode-cats.model: { type: string, enum: [tororo, hijiki], default: tororo, description: 选哪只喵咪 }, vscode-cats.opacity: { type: number, default: 0.8, minimum: 0, maximum: 1, description: 喵咪透明度 }, vscode-cats.apiKey: { type: string, default: , description: TaoToken API Key用于问猫咪命令 } } }配置写完后打开 VSCode 设置页搜索vscode-cats就能看到这些项以 UI 形式出现同时 settings.json 里也能手写覆盖。3.2 settings.json 的实际写法用户侧的 settings.json 长这样注意配置项的 key 必须和 package.json 里properties的键名一致{ vscode-cats.enabled: true, vscode-cats.model: hijiki, vscode-cats.opacity: 0.6, vscode-cats.apiKey: 你的TaoTokenKey }如果你不想把 Key 写进 settings.json也可以走context.secrets.store(taotokenKey, key)在命令里异步读取。两种方式都行前者方便调试后者更安全。4. extension.ts命令注册、配置读取与请求验证4.1 activate 与 registerCommandextension.ts 是入口VSCode 加载插件时调用activate卸载时调用deactivate。命令必须在这里用registerCommand绑定实现且 commandId 与 package.json 完全对应import * as vscode from vscode; export function activate(context: vscode.ExtensionContext) { console.log(vscode-cats 已激活); const hello vscode.commands.registerCommand(vscode-cats.hello, () { const cfg vscode.workspace.getConfiguration(vscode-cats); const model cfg.getstring(model, tororo); vscode.window.showInformationMessage(你好我是 ${model}); }); const ask vscode.commands.registerCommand(vscode-cats.ask, async () { const cfg vscode.workspace.getConfiguration(vscode-cats); const apiKey cfg.getstring(apiKey, ); if (!apiKey) { vscode.window.showWarningMessage(请先在设置里填写 vscode-cats.apiKey); return; } const question await vscode.window.showInputBox({ prompt: 问猫咪一个问题 }); if (!question) return; const answer await askModel(apiKey, question); vscode.window.showInformationMessage(answer); }); context.subscriptions.push(hello, ask); } export function deactivate() {}这里有个容易踩的坑getConfiguration(vscode-cats)的参数是配置节的命名空间不是完整键名。取vscode-cats.model时写cfg.get(model)不要写cfg.get(vscode-cats.model)否则永远拿到默认值。4.2 通过 TaoToken 发起请求下面这个函数用 Node 18 自带的 fetch把 TaoToken 的 API 地址和 Key 拼进去。注意 API 基础地址是https://taotoken.net/api路径补/v1/chat/completionsasync function askModel(apiKey: string, question: string): Promisestring { const res await fetch(https://taotoken.net/api/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model: claude-3-5-sonnet, messages: [{ role: user, content: question }], max_tokens: 256 }) }); if (!res.ok) { return 请求失败${res.status}; } const data: any await res.json(); return data.choices?.[0]?.message?.content ?? 没有返回内容; }模型名按你实际开通的填TaoToken 的模型列表在文档里有对照表。如果你只是验证通道是否通可以先在模型对话页面手动发一条消息确认 Key 有效再回到插件里调。4.3 调试与验证步骤按 F5 会启动一个“扩展开发宿主”窗口这是 VSCode 专门给插件调试用的独立实例。在新窗口里按CtrlShiftP打开命令面板输入Cats:你应该能看到两条命令。点“打个招呼”右下角弹出提示点“问猫咪一个问题”输入问题后如果 Key 正确会返回模型回答。如果命令面板里搜不到命令先检查三处package.json 的commands[].command、activationEvents的onCommand:、extension.ts 的registerCommand是否三处字符串完全一致。这是最高频的失败原因。5. 本篇常见错排查5.1 命令不出现或点击无反应最常见的是 activationEvents 写成了onCommand:vscode-cats.hello但 commands 里写的是vscode-cats.helloWorld后缀对不上。VSCode 不会报错只是静默不激活。另一个原因是改了 package.json 后没有重启扩展宿主窗口配置不会热更新必须关掉调试窗口重新 F5。5.2 配置项读取不到getConfiguration的命名空间写错或者 settings.json 里键名拼错。比如 package.json 定义的是vscode-cats.modelsettings.json 写成vscode-cats.models就会静默回退默认值。排查时可以在命令里console.log(cfg)打印整个配置对象看实际读到了什么。5.3 请求返回 401 或 404401 通常是 Key 无效或没带Bearer前缀404 多半是 API 路径拼错。TaoToken 的基础地址是https://taotoken.net/api补全后是/api/v1/chat/completions不要写成/api/chat/completions或漏掉/v1。如果返回 429说明触发了频率限制降低调用频率即可。5.4 打包后命令失效用vsce package打包时如果.vscodeignore把src或out目录排除了安装后就没有可执行代码。检查.vscodeignore是否误删了编译产物目录。另外engines.vscode版本写得太高低版本 VSCode 会拒绝安装。6. 后续怎么接从 demo 到可用插件跑通这个骨架后你可以把猫咪渲染逻辑按原版思路接进来通过fs读取workbench.html把 HTML 片段注入进去并用!-- /*ext.${extName}.ver.${version}*/ --这样的标识判断版本卸载时从备份恢复。这部分涉及文件读写和版本判断建议单独抽成HTML.ts和version.ts别全塞进 extension.ts。如果你打算把这个插件长期用于团队内部建议把模型调用统一走 TaoToken 的 Coding Plan这样 Key 和额度集中管理不用每个人各自申请。相关入口Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content模型对话验证https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content最后留一个实操建议每次改完 package.json先按CtrlShiftP执行Developer: Reload Window再测命令。这个动作能省掉大量“明明改了却没生效”的困惑。
返回列表