离线部署vscode插件需禁用vsce联网行为:用--skip-license --no-publish跳过市场校验,删icon/gallerybanner字段,npm ci --production确保依赖完整,ts需预编译,最终通过本地安装.vsix分发。

VSCode 插件市场离线部署时,vsce 打包失败或找不到依赖
离线环境里用 vsce package 生成 .vsix 文件,常因网络不可达导致 npm install 失败、vsce 自动拉取 marketplace metadata 超时,甚至卡在 Preparing extension for packaging 阶段。
根本原因不是插件本身写得有问题,而是 vsce 默认会尝试连接 https://marketplace.visualstudio.com 验证 publisher、检查更新、获取图标资源等——这些在离线环境全不可行。
- 确保本地已安装
vsce(推荐全局安装:npm install -g vsce),且版本 ≥ 2.14.0(旧版对离线支持更弱) - 执行打包前,先运行
npm ci --no-audit --no-fund,避免vsce启动时再触发 npm 安装逻辑 - 强制跳过 marketplace 校验:加
--skip-license和--no-publish参数,例如:vsce package --skip-license --no-publish - 若插件含
icon或galleryBanner字段,删掉或注释掉package.json中对应字段,否则vsce仍会尝试下载远程图片
离线环境下如何导出插件及其完整依赖树
单纯打包 .vsix 不等于“可离线安装”——用户机器上若没装过对应 node_modules,又没联网,VSCode 启动插件时仍会报 Cannot find module 'xxx'。
关键在于把 runtime 依赖和 dev 依赖分清楚:dev 依赖(如 @types/vscode)不需要打进 vsix;但所有 dependencies 和 peerDependencies 必须被 npm install --production 安装并保留进 node_modules,再由 vsce 一并打包。
- 清理无关文件:运行
npm prune --production,只保留生产依赖 - 确认
package.json的"main"入口文件路径正确(如"main": "./extension.js"),且该文件不动态require()未声明的模块 - 检查
vsix内容:解压生成的.vsix(它本质是 zip),确认node_modules/下有全部dependencies,且无devDependencies - 如果用了 TypeScript,必须提前用
tsc编译好(vsce不会自动编译 TS),输出目录要和"main"指向一致
vsce publish 在离线环境必然失败,替代方案是什么
vsce publish 必须联网调用 Azure DevOps API,离线环境下直接报错 Failed to publish: Error: connect ECONNREFUSED 或超时。这不是配置问题,是设计使然。
离线部署唯一可行路径是「人工分发 + 本地安装」,而非「发布到官方市场」。
- 生成
.vsix后,通过 U 盘、内网 FTP、共享目录等方式传给目标机器 - 目标机器用 VSCode 图形界面:命令面板(
Ctrl+Shift+P)→ 输入Extensions: Install from VSIX...→ 选中文件 - 或命令行安装:
code --install-extension /path/to/your-extension-1.0.0.vsix(需提前配置好code命令,Linux/macOS 可能需运行Shell Command: Install 'code' command in PATH) - 注意权限:某些企业环境禁用未签名扩展,需在
settings.json中添加"extensions.allowUntrustedExtensions": true
离线插件安装后报 Extension activation failed 的常见诱因
即使 .vsix 成功安装,启动时报激活失败,90% 和路径、模块解析或 Node.js 版本有关,而非代码逻辑错误。
- 检查
console.log输出:打开 VSCode 开发者工具(Help → Toggle Developer Tools),看Console标签页是否有Cannot find module或Unexpected token - 确认 VSCode 内置 Node.js 版本兼容性:VSCode 1.80+ 使用 Node.js 18,若插件用了
??=、at()等新语法,老版本 VSCode(如 1.7x)会直接挂掉 - 避免绝对路径引用:不要在代码里写
require('/home/user/xxx')或__dirname + '/../../lib',离线环境路径结构不确定 - 静态资源(如 JSON Schema、HTML 页面)要用
vscode.Uri.file()构造路径,而不是拼字符串,否则 Windows/Linux 路径分隔符不一致会导致ENOENT
离线场景最易被忽略的是:你以为打包进去了,其实 vsce 默认忽略 node_modules 以外的 node_modules(比如子包里的)。如果用了 pnpm 或 rush,务必手动验证最终 vsix 包内是否真有所有依赖。











