workspace 级别插件禁用常失效,因 .vscode/extensions.json 中的 recommendations/unwantedextensions 仅影响推荐而非激活;真正生效需通过 .vscode/settings.json 关闭插件依赖的配置项(如 "prettier.enable": false),或对极少数支持 disablewhen 的插件配置条件禁用,顽固情况可用 devcontainer 卸载或开发者工具验证加载状态。

为什么 workspace 级别的插件禁用经常失效
VSCode 的插件禁用机制分三层:全局、工作区(workspace)、文件夹(folder)。很多人以为在 .vscode/extensions.json 里写 "recommendations" 或 "unwantedExtensions" 就能阻止插件加载,其实不行——这些只影响推荐和安装提示,不阻止已安装插件的激活。
真正起作用的是插件自身的激活逻辑(比如监听 onLanguage:python、onCommand:xxx),而 VSCode 没有提供“禁止某插件在当前 workspace 激活”的原生开关。所以必须从插件行为源头干预。
用 settings.json 关闭插件触发条件
多数插件依赖特定配置项来决定是否运行。禁用它们比禁用插件本身更可靠。例如:
-
esbenp.prettier-vscode:设"prettier.enable": false,它就不会格式化任何文件,即使插件已加载 -
ms-python.python:设"python.defaultInterpreterPath": ""并清空"python.terminal.executeInFileDir",可阻止其自动启动语言服务器 -
redhat.vscode-yaml:设"yaml.validate": false和"yaml.schemas"为空对象,它基本就“睡着”了
关键点:打开命令面板(Ctrl+Shift+P),输入 Preferences: Open Workspace Settings (JSON),把配置写进 .vscode/settings.json,而非用户设置。
用 extensions.json 配合 disableWhen(仅限支持该字段的插件)
极少数插件(如 editorconfig.editorconfig)在 package.json 中声明了 contributes.configuration.disableWhen 字段,这时你才能靠 extensions.json 控制。但绝大多数插件不支持。
如果你确认某个插件支持,可在 .vscode/extensions.json 写:
{
"recommendations": [],
"unwantedExtensions": ["esbenp.prettier-vscode"],
"disableWhen": {
"esbenp.prettier-vscode": "resourceExtname == '.log'"
}
}
⚠️ 注意:disableWhen 是实验性功能,VSCode 官方文档未公开,且仅对极个别插件生效。别把它当通用方案。
终极手段:用 devcontainer.json 或脚本临时卸载
如果插件行为顽固(比如总在打开文件夹时弹出 LSP 连接失败提示),且你用的是 Dev Container,可在 .devcontainer/devcontainer.json 加:
"customizations": {
"vscode": {
"extensions": ["esbenp.prettier-vscode"]
}
}
然后在容器启动后执行:
code --uninstall-extension esbenp.prettier-vscode
或者更稳妥地,在 .devcontainer/postCreateCommand 里加这行。本地项目则可用 shell 脚本 + code --list-extensions 判断后卸载,但需注意:每次重装插件都会恢复,不适合频繁切换场景。
最常被忽略的一点是:插件可能通过 activationEvents 在任意时刻悄悄唤醒(比如你偶然按了快捷键触发了它的命令)。所以光关配置不够,得结合 Developer: Toggle Developer Tools → Console 查看 ExtensionHost 日志,确认它是否真没加载。











