vscode不支持插件更新自动外发通知,需用外部脚本实现:1. 通过code --list-extensions --show-versions获取本地插件列表;2. 调用marketplace api查询最新版本;3. 用semver库比对版本;4. 记录状态文件防重复通知。

VSCode 本身不提供「检测到插件更新后自动发通知(如邮件、Webhook)」的能力——它的更新机制是单机本地行为,没有外发通道,所有所谓“通知”都只在右下角弹窗或铃铛菜单里显示。想实现自动化检测+外发通知,必须绕过 VSCode 自身逻辑,用外部脚本主动查、主动判、主动推。
用 code --list-extensions --show-versions 提取当前插件状态
这是唯一稳定、无需启动 GUI 即可获取已安装插件列表的方式。它输出形如 esbenp.prettier-vscode@12.0.0 的行,每行含插件 ID 和本地版本号。
- 必须加
--show-versions,否则无法比对是否过期 - 不依赖 VSCode 正在运行;即使编辑器崩溃,命令仍可执行
- Windows 下若提示
code不是内部命令,请确保安装时勾选了「Add to PATH」,或改用完整路径如C:\Users\XXX\AppData\Local\Programs\Microsoft VS Code\bin\code - 输出不含禁用插件,这点和 UI 里一致——禁用的插件不会被纳入更新检查范围
调用 Marketplace API 查最新版本(https://marketplace.visualstudio.com/_apis/public/gallery/publishers/{publisher}/vsextensions/{extension}/{version})
VSCode 插件市场 API 是公开的,但没文档、没认证、会限流。最稳妥的查询方式是:用插件 ID 拼出 URL,GET 请求,解析响应里的 version 字段。
- 例如
esbenp.prettier-vscode→ 请求https://marketplace.visualstudio.com/_apis/public/gallery/publishers/esbenp/vsextensions/prettier-vscode/latest - 响应是 JSON,关键字段为
versions[0].version(注意不是根级version) - 不要用
/latest以外的路径,比如带具体版本号的 URL 可能返回 404,即使那版本真实存在 - 加
User-Agent头(如vscode-update-checker/1.0),否则部分 CDN 节点可能返回 429
对比版本并触发通知(邮件 / Webhook / Slack)
版本比较不能简单字符串比对——VSCode 插件版本号基本遵循 SemVer,但有些插件(如 GitLens)会带预发布标签(18.0.0-insider),直接 > 判断会出错。必须用标准 semver 库解析。
- Python 推荐用
semver.Version.parse()(semver包,非semver4);Node.js 用semver.gt(v1, v2) - 只对「已启用且本地版本
- Webhook 示例:用
curl -X POST -H "Content-Type: application/json" -d '{"text":"Prettier updated to 12.0.0"}' https://hooks.slack.com/xxx - 邮件发送建议走本地
sendmail或 SMTP,别硬连 Outlook/Exchange,容易被拦截
定时执行与防重复(crontab / Task Scheduler + 状态文件)
单纯每小时跑一次脚本会导致大量重复通知。必须记录上次检查时间与已报告的插件版本对,避免“每次都说 Prettier 有新版本”。
- 维护一个 JSON 状态文件,如
~/.vscode-update-state.json,内容为{"esbenp.prettier-vscode": "12.0.0"} - 脚本启动时读该文件,只对「市场版本 > 状态文件记录版本」的插件发通知,然后更新状态文件
- Linux/macOS 用
crontab -e加0 */6 * * * /path/to/check-vscode-updates.sh(每 6 小时) - Windows 用任务计划程序,触发器设为“按预定时间”,操作为启动
powershell.exe并传入脚本路径
真正难的不是查版本,而是处理 Marketplace API 的不稳定返回、插件作者乱写的版本号、以及 VSCode 自身对禁用插件的隐藏逻辑——这些细节不写进脚本,通知就会漏报或狂轰滥炸。











