vscode 官方扩展市场在内网不可用,因其默认连接外网 https://marketplace.visualstudio.com,且1.80+版本强制使用内置网络栈绕过系统代理;可行方案是自建私有市场服务,如 vscode-extension-marketplace-server,并通过配置 extensions.gallery.serviceurl 指向该服务。

为什么 VSCode 官方扩展市场在内网不可用
VSCode 启动时默认从 https://marketplace.visualstudio.com 拉取扩展列表,所有搜索、安装、更新行为都依赖该域名及其 CDN(如 vscode.blob.core.windows.net)。内网断外网时,Extensions: Install Extension 会卡住或报错 Unable to fetch extensions,控制台常见错误是 getGalleryServiceUrl failed 或 network error。
这不是代理能简单解决的问题——VSCode 1.80+ 对 Marketplace 的请求已强制走内置网络栈,绕过系统代理;且部分请求带签名 header,无法被普通反向代理透传。
真正可行的路径只有一条:自建兼容 VSCode 协议的私有扩展市场服务,让客户端认为它就是官方市场。
用 vscode-extension-marketplace-server 搭建最小可用私服
社区最轻量、协议兼容性最好的方案是 vscode-extension-marketplace-server(注意不是同名但已废弃的旧项目)。它不依赖数据库,纯静态文件 + 内存索引,适合内网快速部署。
关键操作要点:
- 用
npm install -g vscode-extension-marketplace-server全局安装(需 Node.js 16+) - 准备扩展包:把
.vsix文件统一放在/path/to/extensions/目录下(支持子目录嵌套) - 启动命令:
vscode-extension-marketplace-server --extensions-dir /path/to/extensions --port 8080 --host 0.0.0.0 - 启动后访问
http://your-server:8080应返回 JSON 格式服务元信息,说明服务就绪
⚠️ 注意:--host 0.0.0.0 必须显式指定,否则默认绑定 127.0.0.1,其他机器无法访问;端口若被占用,VSCode 客户端不会 fallback,而是直接失败。
VSCode 客户端如何指向你的私服
VSCode 不提供图形界面切换市场源,必须通过配置项 extensions.gallery.serviceUrl 和 extensions.gallery.recommendationsUrl 强制重定向。
两种生效方式:
-
全局配置(推荐):编辑
$HOME/.vscode/settings.json(Linux/macOS)或%USERPROFILE%\AppData\Roaming\Code\User\settings.json(Windows),加入:
{
"extensions.gallery.serviceUrl": "http://your-server:8080/api/gallery",
"extensions.gallery.recommendationsUrl": "http://your-server:8080/api/gallery/recommendations"
}
-
策略配置(域控环境):通过 Windows 组策略或 macOS MDM 推送
extensionsGallery策略,路径为HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\VSCode\extensionsGallery,值为 JSON 字符串,含serviceUrl字段
改完后重启 VSCode。打开扩展面板,输入任意关键词,Network 面板应看到请求发往你自己的 /api/gallery 路径,而非 marketplace.visualstudio.com。
扩展上传与版本管理的实际约束
私服本身不提供 Web 上传界面,所有 .vsix 必须手动放入 --extensions-dir 对应目录。这带来三个现实问题:
- 文件名不能随意:必须符合
PUBLISHER.NAME-VERSION.vsix格式(如ms-python.python-2024.2.0.vsix),否则服务启动时会跳过该文件 - 同一扩展多版本共存:只要版本号不同,服务会自动识别为不同版本;但 VSCode 客户端安装时默认选最新版,不显示历史版本选择框
- 无签名验证:官方市场会对
.vsix做 publisher 签名校验,私服完全跳过此步——这意味着你得自行确保来源可信,尤其当分发内部 fork 版本时
如果公司已有 Nexus 或 Artifactory,可考虑用其 raw repository 模式托管 .vsix,再用 Nginx 反向代理 + rewrite 规则模拟 Marketplace API 路径,但调试成本远高于直接用 vscode-extension-marketplace-server。
真正麻烦的从来不是搭起来,而是让每个开发机的 VSCode 都稳定读到你更新后的扩展列表——缓存、DNS、HTTPS 混合内容拦截,任何一个环节出问题,都会表现为“明明服务跑着,扩展却搜不到”。











