VSCode 的 settings.json 不支持自定义变量定义,仅支持引用预定义内置变量(如 ${workspaceFolder})和已注册配置项(${config:xxx}),因其是声明式纯配置层,非模板引擎。

VSCode 的配置文件(settings.json)本身不支持“定义变量”语法,比如 "myVar": "value" 然后在别处用 ${myVar} 引用——这种写法会直接报错或被忽略。它只支持“引用变量”,且仅限于预定义的内置变量(如 ${workspaceFolder})和通过 ${config:xxx} 读取其他已存在的配置项。
为什么 settings.json 里不能像 launch.json 那样自定义变量
VSCode 的 settings.json 是纯配置层,不是模板引擎。它的设计目标是声明式设置,而非动态计算。所有变量替换能力都集中在调试(launch.json)、任务(tasks.json)和代码片段(.code-snippets)这类需要运行时上下文的场景中。
-
settings.json中写${env:HOME}或${userHome}是合法的,因为它们属于“读取型变量”,VSCode 启动时就解析并固化为实际值 - 但你不能在
settings.json里声明一个"projectBuildDir": "./dist",再用${config:projectBuildDir}去拼接路径——虽然语法不报错,但${config:...}只能读取 *已注册的、顶层的* 配置项,不能读取你自己随意加的字段 - 真正能被
${config:xxx}读取的,必须是 VSCode 认可的配置键名,比如editor.tabSize、files.autoSave,或者你通过扩展注册的配置(如rest-client.environmentVariables)
${config:xxx} 能读什么、不能读什么
这个语法本质是“配置反射”,不是变量作用域。它查的是 VSCode 当前生效的配置树,不是 JSON 文件里的任意字段。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- ✅ 可读:已安装扩展暴露的配置项,例如
${config:rest-client.defaultEnvironment}(前提是 REST Client 已启用) - ✅ 可读:用户/工作区 settings 中已存在的标准配置,例如
${config:files.encoding} - ❌ 不可读:
settings.json里自己加的注释字段、临时标记、嵌套对象里的子字段(如"myProject": {"outDir": "./build"}→${config:myProject.outDir}无效) - ❌ 不可读:未激活扩展的配置项(即使 JSON 里写了,扩展没装或禁用,
${config:xxx}返回空字符串)
想在 settings.json 里实现“变量效果”,只能靠间接方式
没有原生变量定义 ≠ 完全没法复用。有三个实际可行的替代路径:
- 用
${workspaceFolder}+ 固定相对路径代替“变量”。例如统一构建目录,直接设"npm.packageManager": "npm"和"files.exclude": { "**/node_modules": true, "${workspaceFolder}/dist": true }——注意这里${workspaceFolder}是合法的,但不能写成"distPath": "${workspaceFolder}/dist"再引用 - 把重复逻辑下沉到扩展配置。比如用
terminal.integrated.env.linux设置终端环境变量,再在脚本里读$DIST_DIR,而不是在 settings 里硬编码路径 - 对高度定制化需求,改用
tasks.json或launch.json承载变量逻辑,再通过命令调用(${command:workbench.action.terminal.new})间接影响编辑器行为
最容易被忽略的一点:很多人试图在 settings.json 里用 ${fileBasename} 这类“文件上下文变量”,结果发现全是空的——因为 settings.json 是静态加载的,不随当前编辑的文件变化;这些变量只在 tasks.json 或 launch.json 的执行时刻才有效。

















