vsce package 前必须先编译 TypeScript,否则因找不到 extension.js 报错;需检查 main 字段路径、执行 tsc 或 webpack 编译;engines.vscode 版本须匹配本地 VSCode;node_modules 需通过 externals 或 ignore 排除;安装失败多因版本不兼容、activationEvents 配置错误或 publisher 不合法。

vsce package 命令执行前必须确保 TypeScript 已编译
直接运行 vsce package 却提示找不到 extension.js 或报错“Cannot find module './out/extension.js'”,大概率是因为你用的是 TypeScript 项目,但还没编译。VSCode 插件运行时只认 JavaScript,vsce 默认打包的是 main 字段指向的 JS 文件(比如 "main": "./out/extension.js"),不会自动调用 tsc。
实操建议:
- 检查
package.json中的main字段路径,确认它指向的是已生成的 JS 文件(不是src/extension.ts) - 运行
npm run compile或npx tsc,确保out/(或你配置的outDir)目录下有编译后的 JS 和对应.d.ts文件 - 如果项目用了
webpack,则要先运行npm run webpack或npx webpack,让最终产物落在out/extension.js或你配置的output.filename路径 - 常见错误:
vsce package成功但安装后命令不响应——八成是main指向了未编译的 TS 文件,或编译后入口逻辑没导出activate/deactivate
engines.vscode 版本不匹配会导致 vsce package 失败
运行 vsce package 报错类似 Unsupported engines.vscode version '^1.90.0' 或 vscode version not satisfied,说明你 package.json 里写的 engines.vscode 值高于当前本地 VSCode 版本,vsce 会严格校验。
实操建议:
- 运行
code --version查看当前 VSCode 版本(例如1.89.1) - 打开
package.json,把"engines": {"vscode": "^1.90.0"}改成 ≤ 你本地版本的最小兼容值,比如"^1.89.0"或更保守的"^1.87.0" - 不要降级 VSCode 来迁就插件——升级 VSCode 到最新稳定版(目前 2026 年 10 月最新是
1.94.x)更稳妥,旧版本可能缺失你用到的 API(如vscode.workspace.findFiles的某些选项) - 如果你依赖了较新的 API(比如
vscode.window.withProgress的cancellable参数),查官方 API 参考页底部的 “Added in” 版本,再设engines.vscode
打包时 node_modules 不会被自动排除,但必须显式声明 externals
默认情况下 vsce package 会把整个 node_modules 打进去,导致 .vsix 文件体积暴涨(动辄 50MB+),且极大概率引发运行时冲突——尤其是当你依赖了含原生模块(node-gyp 编译)或 Electron 相关包时。
实操建议:
-
vsce默认已将vscode设为 external,但其他依赖需手动处理 - 如果你用
webpack,在webpack.config.js的externals中加入你所有 runtime 依赖,例如:externals: { vscode: 'commonjs vscode', 'axios': 'commonjs axios' } - 如果你不用构建工具,就在
package.json的vsce字段里加"ignore": ["node_modules/**"],但前提是这些模块确实没被 require —— 否则运行时报Cannot find module - 验证方式:解压生成的 .vsix(它本质是 zip),检查根目录下有没有
node_modules文件夹;没有,且插件功能正常,说明处理成功
安装 .vsix 文件时提示“Extension is not compatible with Code”
双击 .vsix 或通过 Extensions 视图的 “Install from VSIX…” 安装后,VSCode 弹窗报这个错,根本原因不是文件损坏,而是 package.json 里的两个字段和当前环境对不上:
-
engines.vscode:已提过,版本低于要求会拒绝加载 -
activationEvents:如果写成["onLanguage:python"],但用户没装 Python 扩展,VSCode 会跳过激活,看起来就像“没装上”;更隐蔽的是写了onCommand:xxx却没在contributes.commands里注册同名命令,也会静默失败 - 还有个硬性限制:
publisher字段不能为空,也不能含空格或特殊字符;如果之前用测试账号发布过同名插件,本地调试时 publisher 冲突也可能导致安装卡住
最容易被忽略的一点:修改完 package.json 后,必须重新运行 vsce package 生成新 .vsix——旧文件不会自动更新元数据。











