code --install-extension命令不重试,因electron内置fetch无重试机制,遇connect etimedout等错误即静默退出;须先配置vscode.cdn.azure.cn镜像源并彻底退出vs code进程,再用shell循环重试。

VS Code 命令行安装扩展(code --install-extension)卡住不动或报超时,不是重试次数不够的问题,而是底层网络请求失败后直接退出,根本没触发“重试”逻辑——它只尝试一次,失败就停。
为什么 code --install-extension 不重试
VS Code 的命令行安装器调用的是 Electron 内置的 fetch,默认无重试机制。遇到 connect ETIMEDOUT、getaddrinfo ENOTFOUND 或 TLS 握手失败时,会立刻返回错误,不等待、不轮询、不自动换源。
- 错误示例:
ERROR: Failed to install extension "ms-python.python": connect ETIMEDOUT 20.43.138.162:443 - 对比 GUI:图形界面至少会显示“重试中”,而命令行连这个提示都没有,静默失败
- 关键点:它不读
http.proxy配置,也不走系统代理环境变量,只认硬编码的 gallery 地址
真正有效的重试方案:改源 + 手动循环
必须先让请求能发出去,再用 shell 脚本包装实现可控重试。不能依赖 VS Code 自身逻辑。
- 先确保已配置国内镜像源(否则所有重试都无效):
编辑settings.json,加入三行(注意末尾斜杠):"extensions.gallery.serviceUrl":"https://vscode.cdn.azure.cn/extensionGallery/extensionGallery/""extensions.gallery.itemUrl":"https://vscode.cdn.azure.cn/extensionGallery/extensionGallery/item""extensions.gallery.cacheUrl":"https://vscode.cdn.azure.cn/extensionGallery/extensionGallery/" - 彻底退出所有 VS Code 进程(Windows 任务管理器杀光
Code.exe和Code Helper.exe;macOS/Linux 执行killall -9 code) - 用 bash/zsh 封装带重试的安装命令(Windows 可用 Git Bash 或 WSL):
for i in {1..3}; do code --install-extension ms-python.python && break || echo "Try $i failed, waiting 2s..."; sleep 2 done
下载失败时怎么知道是哪一环断了
命令行不输出网络详情,得靠外部工具定位。执行前先验证基础链路:
- 检查镜像源是否可达:
curl -I https://vscode.cdn.azure.cn/extensionGallery/extensionGallery/,应返回200 OK或302 - 确认 DNS 解析正常:
nslookup vscode.cdn.azure.cn,避免本地 hosts 或 DNS 污染 - 若 curl 成功但
code --install-extension失败,大概率是 VS Code 进程残留导致权限冲突或端口占用——任务管理器里看有没有Code Helper (Renderer)进程挂着 - 特别注意:
.vsix文件若从浏览器下载,可能被安全软件截断(文件大小 wget 或curl -L -o直接拉取
最容易被忽略的是:改完 settings.json 后没杀干净进程,VS Code 仍在用旧地址发起请求——此时任何重试脚本都只是对着空气打转。











