VS Code 1.85+ 因严格校验 engines.vscode 字段导致老插件被静默禁用或离线安装失败,需通过 Marketplace URL 参数 ?vscodeVersion=x.x.x 获取兼容版本,或解压 .vsix 修改 extension/package.json 中的 vscode 值为 >=1.85.0 等宽松范围,并重打包安装。

VS Code 1.85+ 版本起,插件兼容性检查变严格,很多老插件直接灰掉、点不开,甚至离线安装 .vsix 都卡在 Unable to install extension 'xxx' as it is not compatible with VS Code '1.xx.x' ——这不是网络或权限问题,是引擎声明硬拦截。
怎么看当前 VS Code 实际版本和 commit ID
光看「关于」里写的 1.90.2 不够,Remote-SSH 或 server 类插件依赖的是完整 commit ID。必须用命令行确认:
- 终端执行
code --version,第一行是语义化版本(如1.90.2),第二行就是 40 位 commit ID(如b3d1a1c8f7e9d0a2c4b6e8f0a1c3d5e7f9b1d3a5) - Remote-SSH 连接失败时,错误日志里反复出现的
Failed to fetch commit hash就是在告诉你:远端缺这个 commit ID 对应的vscode-server - 别信“我装的是 1.90 稳定版”,不同 patch 版本(
1.90.0/1.90.1/1.90.2)commit ID 完全不同,server 不能混用
查插件 engines.vscode 字段的三种路径
插件不兼容,核心就卡在 package.json 里的 "engines": { "vscode": "..." }。得知道它在哪、怎么改、改完是否生效:
- 已安装插件:定位到
~/.vscode/extensions/作者名.插件名-版本号/(macOS/Linux)或%USERPROFILE%\.vscode\extensions\作者名.插件名-版本号\(Windows),直接编辑根目录下package.json - 离线
.vsix包:用unzip/7-Zip解压,进extension/package.json(注意不是根目录那个!)改"vscode"值,再重打包为 zip → 改后缀为.vsix - Marketplace 页面查旧版:在插件 URL 后加
?vscodeVersion=1.85.2(换成你本地版本),刷新后右下角出现Install Another Version…下拉菜单,只选带 ✅ 的版本
改 engines.vscode 时最容易踩的坑
字段值看着简单,但写错一个字符就白忙活:
- 别写成
"^1.85"—— 缺少补零会匹配失败,必须写"^1.85.0"或更宽松的">=1.85.0" - 多个版本范围要用
||连接,比如"^1.78.0 || ^1.85.0",不能用逗号或空格 - Remote-SSH 插件本身有前后端两部分:
engines.vscode控制前端加载,但远端vscode-server必须和本地 commit ID 严格一致,改字段解决不了 server 启动卡住的问题 - 改完必须执行
Developer: Reload Window,只点「启用」没用;如果插件已禁用,重启前先删掉node_modules和package-lock.json(仅限你本地能构建的开源插件)
哪些插件要特别盯紧 engines 变动
高频出问题的几个包,它们在 1.102+ 后收紧了限制,内网或锁版本环境尤其容易中招:
-
ms-python.python:1.102 起要求^1.102.0,低于该版本的机器装不上,得手动降级或改字段 -
esbenp.prettier-vscode:最新版已锁死">=1.85.0 ,如果你用的是1.84.2,连 Marketplace 都不给你展示旧版选项 -
ms-ceintl.vscode-language-pack-zh-hans:中文包报not compatible八成是因为你下了为1.103.0打的包,但本地是1.90.2,改"vscode": ">=1.85.0"最快 -
ms-vscode-remote.remote-ssh:它不光控制前端,还会触发远端下载vscode-server,commit ID 不对就卡在Starting VS Code Server,这时候改engines没用,得去远端手动放对应 commit 的 server 包
真正麻烦的从来不是改一行 JSON,而是改完发现插件启动时报 TypeError: xxx is not a function——说明它真调用了新版才有的 API。这种时候,engines 字段只是门禁,代码才是实打实的墙。











