vscode 1.90+ 对变量解析机制进行了严格校验:${env:xxx} 因环境注入时机变更而为空;${config:xxx} 因未监听配置变化而失效;${input:xxx} 等自定义变量需在 package.json 中声明,否则静默忽略。

VSCode 插件更新后,自定义变量(如 ${workspaceFolder}、${env:PATH}、${config:editor.tabSize})在 launch.json、tasks.json 或插件配置中突然无法解析,不是语法写错了,也不是路径不存在,而是 VSCode 1.90+ 对变量扩展的执行时机和上下文做了更严格的校验——部分变量现在必须在特定激活阶段才可用,且插件若未适配新 API,会跳过变量注册逻辑,导致空值或静默 fallback 到默认值。
为什么 ${env:XXX} 在 launch.json 中突然变为空
VSCode 1.90 起将环境变量注入从“启动前预解析”改为“调试器进程 spawn 时按需注入”,而旧版插件(尤其是自定义调试适配器)若仍依赖 vscode.env 在 activate() 阶段读取环境,此时 process.env 尚未被完整继承,${env:XXX} 就会解析失败或返回空字符串。
- 验证方式:在
launch.json的env字段里加一条"DEBUG_ENV": "${env:HOME}",然后在调试终端里运行echo $DEBUG_ENV—— 若为空,说明变量未注入 - 临时绕过:改用
"env": { "HOME": "/your/path" }硬编码(仅测试用) - 根本修复:检查你用的调试插件是否已发布适配 VSCode 1.90+ 的版本;若为自研适配器,需在
DebugAdapterDescriptorFactory.createDebugAdapterDescriptor()中显式调用vscode.env.shell或监听onDidStartDebugSession后再读取
${config:xxx} 不再响应 settings.json 修改
VSCode 现在对配置变量的监听粒度更细。如果插件使用了已废弃的 vscode.workspace.getConfiguration().get('xxx') 方式直接取值(而非订阅 onDidChangeConfiguration),那么你在 settings.json 里改了 editor.insertSpaces,${config:editor.insertSpaces} 在 tasks.json 里仍会卡在旧值,因为插件没重新触发变量求值。
- 常见于 Shell/Python/Tasks 类插件,尤其当它们把配置缓存在类属性里且不监听变更
- 快速确认:打开命令面板 → 运行
Developer: Toggle Developer Tools→ Console 输入vscode.workspace.getConfiguration().get('editor.insertSpaces'),看是否与设置页一致 - 修复建议:优先升级插件;若插件长期不更新,可改用硬编码或在
tasks.json中用args显式传参替代变量引用
自定义变量(如 ${input:myPrompt})报错 “Unknown variable”
这是 VSCode 1.89 引入的变量注册白名单机制生效所致。所有非内置变量(${input:xxx}、${command:xxx}、${extensionSetting:xxx})现在必须由插件在 package.json 的 contributes.variables 中提前声明,否则会被直接忽略,控制台也不报错,只静默失效。
- 检查你依赖的插件(比如
donjayamanne.python-extension或ms-python.pylint)是否在package.json里包含类似:"contributes": { "variables": [ { "name": "python.defaultInterpreterPath", "description": "Path to the default Python interpreter" } ] } - 若你用的是社区脚本或自定义任务,且其中含
${input:xxx},必须确保提供该 input 的插件已启用并完成激活(查看 Developer Tools → Console 是否有registerInput相关日志) - Windows 用户特别注意:
${env:USERPROFILE}在新版中可能被重定向为${env:HOMEPATH},因 Windows 系统变量优先级变化,建议统一用${env:HOME}或${env:USERPROFILE}二选一并测试
最易被忽略的一点:变量解析失败往往不抛异常,也不进 Output 面板日志,它就安静地变成空字符串或 fallback 值——所以别只盯着报错弹窗,得去对应执行环境(调试终端、任务输出、插件日志)里实际 echo / print 一下变量结果。











