vscode插件发布失败主因是vsce login未生效或package.json中publisher字段与marketplace账户名大小写不一致;需确保login后提示的publisher与package.json逐字符匹配,且activationevents、main路径、contributes.commands等配置正确,icon为128×128 png,readme首行为#显示名,license文件存在且非空。

VSCode插件发布失败,90%是因为 vsce login 没真正生效,或 package.json 中 publisher 字段和 Marketplace 账户名大小写不一致。
vsce login 为什么总卡在“Failed to publish”
vsce publish 报错不提示具体原因,本质是认证链断裂。它不会校验你是否登录成功,只会在上传时静默拒绝。
- 必须运行
vsce login(不是vsce publish),它会打开浏览器跳转 Azure DevOps 授权页;手动填 token 是无效的 - 登录后生成的 token 存在
~/.vscode/extensions/下某个隐藏文件里,Windows 用户若用 PowerShell,可能因执行策略被拦截——临时运行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - token 绑定的是 publisher 名,不是邮箱或显示名;
vsce login后会提示 “You are now logged in as”,这个 <publisher></publisher>必须和package.json中的publisher字段**逐字符一致**(包括大小写)
package.json 的 activationEvents 和 main 字段错一个就静默失败
插件根本不会被加载,不是报错,而是“查无此插件”——命令搜不到、断点不命中、console.log 不输出,全是这个原因。
-
activationEvents必须显式声明,不能依赖默认值;VSCode 2025 年底起对"*"做了懒加载降级,建议按需写,例如注册了my-ext.doIt命令,就配["onCommand:my-ext.doIt"] -
main字段必须指向编译后的 JS 文件,TypeScript 项目常见错误是写成"main": "./src/extension.ts",正确应为"main": "./out/extension.js"(对应tsconfig.json的outDir) -
contributes.commands中的commandID 必须和vscode.commands.registerCommand("xxx")第一个参数完全一致,连中划线位置都不能错
.vsix 打包前必须人工核对三项硬性合规项
vsce package 会生成 .vsix,但不会检查 icon 尺寸、README 格式、license 文件是否存在——这些全在 Marketplace 审核阶段被拒,且不给重试机会。
-
icon字段指向的图片必须是 128×128 像素 PNG,路径相对于package.json;名字不能含空格或中文 -
README.md必须存在且首行是# <displayname></displayname>,不能是空文件或只有链接 - 必须有
LICENSE或LICENSE.md文件,内容不能为空;MIT 协议可直接用echo "MIT" > LICENSE生成
本地调试时 reload window 不等于重载插件逻辑
改完代码按 Ctrl+R/Cmd+R 只会重启 Extension Host 进程,但不会重新读取 package.json 的贡献点或激活事件配置。
- 修改
contributes或activationEvents后,必须先在扩展面板里禁用再启用你的插件,否则新配置不生效 - 修改
src/extension.ts后,确保已运行npm run compile(或pnpm run compile),否则out/extension.js还是旧代码 - 想看结构化日志,别只靠
console.log;用vscode.window.showInformationMessage()或写入outputChannel,输出才可见
真正卡住发布的,从来不是代码逻辑,而是 publisher 名大小写、icon 尺寸、LICENSE 文件是否存在这种一眼扫过去就该发现却总被跳过的细节。











