VS Code中launch.json文件用法详解

每一个懂事淡定的现在,都有一个很傻很天真的过去,每一个温暖而淡然的如今,都有一个悲伤而不安的曾经

Posted by yishuifengxiao on 2025-10-08

launch.json文件

什么是 launch.json

launch.json 文件位于项目根目录的 .vscode 文件夹下。它的主要作用是告诉 VS Code 的调试器:

  • 如何启动你的程序(例如,使用哪个解释器/运行时,传递什么参数)。
  • 如何附加到已经运行的程序上进行调试。
  • 为不同的编程语言和运行时环境(Node.js, Python, C++, Go, .NET等)提供定制化的调试配置。

简而言之,它让你可以按 F5 键就能一键启动一个复杂的调试会话,而无需在终端中输入一长串命令。


如何创建 launch.json

  1. 在 VS Code 中打开你的项目文件夹。
  2. 切换到 “运行和调试” 视图(快捷键 Ctrl+Shift+DCmd+Shift+D on Mac)。
  3. 点击 “创建一个 launch.json 文件”
  4. VS Code 会尝试检测你的项目类型(如 Python, Node.js)并提供相应的模板。选择一个,它会自动生成一个初始的 launch.json 文件。

launch.json 的整体结构

一个典型的 launch.json 文件包含一个 配置数组,名为 configurations,里面可以包含多个调试配置。你还可以有一个顶级的 version 属性和一个可选的 compounds 属性(用于同时启动多个配置)。

{
"version": "0.2.0",
"configurations": [
{
// 配置项 1 (例如:启动 Python 脚本)
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
// ... 其他具体配置
},
{
// 配置项 2 (例如:附加到 Node.js 进程)
"name": "附加到 Node 进程",
"type": "node",
"request": "attach",
// ... 其他具体配置
}
],
"compounds": [
{
// 复合配置,用于同时启动多个配置
"name": "启动客户端和服务端",
"configurations“: ["启动服务端", "启动客户端"]
}
]
}

核心配置属性(所有环境通用)

这些是绝大多数调试配置都会用到的基本属性。

属性名 是否必需 描述
name 在调试下拉菜单中显示的可读名称,例如 “启动服务器”。
type 指定调试器类型。这决定了使用哪个 VS Code 调试扩展。
- node (JavaScript/Node.js)
- python
- cppvsdbg (Windows C/C++)
- cppdbg (其他平台的 C/C++, 需要 GDB/LLDB)
- go
request 调试请求类型。
- launch: 启动一个新的程序并进行调试。
- attach: 附加到一个已经运行的进程或远程主机上进行调试。
program launch 时常用 指定要调试的程序入口文件。
- Python: /path/to/app.py
- Node.js: /path/to/app.js
- C++: /path/to/executable
args 传递给程序的命令行参数数组
例:["--port", "3000", "--verbose"]
env 设置程序运行时的环境变量。是一个键值对对象。
例:{ "NODE_ENV": "development", "API_KEY": "12345" }
cwd 设置程序运行时的当前工作目录。默认为 ${workspaceFolder}
console 指定输出显示在哪个控制台。
- internalConsole: VS Code 内置调试控制台(默认)
- integratedTerminal: VS Code 集成终端
- externalTerminal: 外部系统终端
preLaunchTask 启动调试之前运行一个在 tasks.json 中定义的 任务。例如,编译代码、运行 npm 脚本等。
postDebugTask 调试结束之后运行一个任务。
internalConsoleOptions 控制调试控制台的行为,例如 neverOpen

重要的预定义变量(占位符)

这些是 VS Code 提供的变量替换功能,让你可以动态地引用路径和值,使配置更通用。

变量 描述
${workspaceFolder} 最常用。表示在 VS Code 中打开的项目根目录的绝对路径。
${workspaceFolderBasename} workspace 文件夹的名称,不含任何路径。
${file} 当前打开的活动文件的绝对路径。
${relativeFile} 当前打开的文件相对于 workspaceFolder 的相对路径。
${fileBasename} 当前文件的基本名称(含扩展名),例如 app.py
${fileBasenameNoExtension} 当前文件的基本名称(不含扩展名),例如 app
${fileDirname} 当前文件所在目录的绝对路径。
${fileExtname} 当前文件的扩展名,例如 .py
${lineNumber} 当前光标所在的行号。
${selectedText} 当前在编辑器中选中的文本。
${env:VARIABLE} 引用环境变量,例如 ${env:HOME}${env:PATH}
${config:SETTING} 引用 VS Code 的用户设置,例如 ${config:python.pythonPath}
${command:COMMAND} 执行一个 VS Code 命令并返回值。

使用示例:

{
"name": "调试当前 Python 文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": [
"--input",
"${fileDirname}/input.txt"
],
"env": {
"MY_PROJECT_HOME": "${workspaceFolder}"
}
}

这个配置会:调试当前活动的文件,在工作目录的集成终端中运行,并传递一个参数指向当前文件同目录下的 input.txt,同时设置一个环境变量指向工作区根目录。


VS Code launch.json 核心配置属性详细说明

基础必需属性

name - 配置名称

作用:在调试下拉菜单中显示的可读标识符

{
"name": "启动 Node.js 服务器",
"type": "node",
"request": "launch"
}

详细说明

  • 必需属性,用于区分不同的调试配置
  • 应该具有描述性,清晰说明配置的用途
  • 支持使用表情符号增强可读性
  • 在多配置环境中,命名应体现配置的差异

type - 调试器类型

作用:指定使用的调试器扩展

{
"name": "Python 调试",
"type": "python", // 使用 Python 调试扩展
"request": "launch"
}

常用值

  • "node" - Node.js JavaScript 调试
  • "python" - Python 调试
  • "cppvsdbg" - Windows C/C++ 调试
  • "cppdbg" - GDB/LLDB C/C++ 调试
  • "go" - Go 语言调试
  • "java" - Java 调试
  • "php" - PHP 调试

注意事项

  • 必须安装对应的 VS Code 扩展
  • 类型名称区分大小写
  • 某些语言可能有多个调试器类型可选

request - 调试请求类型

作用:定义调试会话的启动方式

{
"name": "启动新进程",
"type": "node",
"request": "launch", // 启动新进程
"program": "${workspaceFolder}/app.js"
}

两种模式

"launch" - 启动模式

{
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": ["--port", "3000"]
}

特点

  • 启动全新的进程进行调试
  • 完全控制进程的生命周期
  • 可以设置启动参数和环境变量
  • 适用于开发阶段的调试

"attach" - 附加模式

{
"request": "attach",
"port": 9229,
"address": "localhost"
}

特点

  • 附加到已运行的进程进行调试
  • 进程必须已启用调试支持
  • 适用于生产环境问题诊断
  • 适用于容器化应用调试

程序执行控制属性

program - 程序入口

作用:指定要调试的可执行文件或脚本

{
"name": "启动应用",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/main.js"
}

语言特定用法

  • Node.js: .js 文件路径
  • Python: .py 文件路径
  • Go: 包路径或可执行文件
  • Java: 主类名
  • C++: 编译后的可执行文件路径

args - 命令行参数

作用:传递给程序的命令行参数数组

{
"name": "带参数启动",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
"--port", "3000",
"--env", "development",
"--verbose",
"--config", "${workspaceFolder}/config.json"
]
}

特性

  • 数组中的每个元素代表一个参数
  • 支持使用变量占位符
  • 参数顺序与命令行一致
  • 可以包含标志和值对

env - 环境变量

作用:设置程序运行时的环境变量

{
"name": "设置环境变量",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"env": {
"NODE_ENV": "development",
"DEBUG": "app:*",
"DATABASE_URL": "postgresql://localhost:5432/dev",
"API_KEY": "${env:MY_API_KEY}",
"LOG_LEVEL": "debug",
"PORT": "3000"
}
}

重要特性

  • 键值对形式的环境变量设置
  • 支持变量替换 ${env:EXISTING_VAR}
  • 可以覆盖系统环境变量
  • 敏感信息应通过系统环境变量传递

cwd - 工作目录

作用:设置程序运行的当前工作目录

{
"name": "设置工作目录",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"cwd": "${workspaceFolder}/src",
"args": [
"--config", "../config/dev.json"
]
}

使用场景

  • 相对路径解析的基准目录
  • 模块解析的起点
  • 文件读写的默认位置
  • 如果不设置,默认为 ${workspaceFolder}

调试器行为控制属性

stopOnEntry - 入口断点

作用:程序启动后是否立即在入口点暂停

{
"name": "入口调试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"stopOnEntry": true, // 在程序开始处暂停
"console": "integratedTerminal"
}

适用场景

  • 希望从程序第一行开始单步调试
  • 调试初始化过程
  • 检查启动参数和环境设置

console - 控制台类型

作用:指定程序输出的显示位置

{
"name": "不同控制台示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"console": "integratedTerminal" // 使用集成终端
}

可选值

"internalConsole" - 内置调试控制台

{
"console": "internalConsole"
}

特点

  • VS Code 内置的调试控制台
  • 不支持交互式输入(如 readline
  • 输出格式良好,支持 ANSI 颜色
  • 默认选项

"integratedTerminal" - 集成终端

{
"console": "integratedTerminal"
}

特点

  • 使用 VS Code 的集成终端
  • 支持交互式输入
  • 更接近真实终端体验
  • 推荐用于需要用户输入的程序

"externalTerminal" - 外部终端

{
"console": "externalTerminal"
}

特点

  • 在系统默认终端中运行
  • 完全独立的终端体验
  • 适用于需要特定终端功能的场景

internalConsoleOptions - 控制台行为

作用:控制内置调试控制台的行为

{
"name": "控制台选项",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"console": "internalConsole",
"internalConsoleOptions": "openOnSessionStart"
}

可选值

  • "neverOpen" - 从不自动打开调试控制台
  • "openOnSessionStart" - 调试开始时自动打开
  • "openOnFirstSessionStart" - 首次调试会话时打开

生命周期和任务集成属性

preLaunchTask - 启动前任务

作用:在调试开始前执行的任务名称

{
"name": "构建后调试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/dist/app.js",
"preLaunchTask": "build", // 执行 tasks.json 中的 build 任务
"args": ["--production"]
}

配合 tasks.json
// tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "npm",
"script": "build",
"group": "build"
}
]
}

常见用途

  • 编译源代码
  • 运行测试套件
  • 安装依赖
  • 准备测试数据
  • 启动依赖服务

postDebugTask - 调试后任务

作用:调试会话结束后执行的任务

{
"name": "调试后清理",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"postDebugTask": "cleanup", // 调试结束后执行清理
"env": {
"CREATE_TEMP_FILES": "true"
}
}

常见用途

  • 清理临时文件
  • 停止测试服务
  • 生成调试报告
  • 重置测试数据库

高级调试控制属性

skipFiles - 跳过文件

作用:指定在调试过程中跳过的文件模式

{
"name": "跳过第三方代码",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"skipFiles": [
"<node_internals>/**", // 跳过 Node.js 内部文件
"${workspaceFolder}/node_modules/**", // 跳过 node_modules
"**/test/**", // 跳过测试文件
"**/vendor/**" // 跳过供应商代码
]
}

模式语法

  • ** - 匹配任意多级目录
  • * - 匹配单级目录或文件
  • <pattern> - 特殊模式(如 <node_internals>

sourceMaps - 源映射支持

作用:启用或禁用 JavaScript 源映射

{
"name": "TypeScript 调试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/dist/app.js",
"sourceMaps": true, // 启用源映射
"outFiles": ["${workspaceFolder}/dist/**/*.js"]
}

配合 TypeScript/转译代码

  • 允许在源代码(如 .ts)中调试,而不是编译后的代码
  • 需要正确的源映射文件

restart - 自动重启

作用:进程退出后是否自动重启调试会话

{
"name": "自动重启",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"restart": true, // 进程退出后自动重启
"console": "integratedTerminal"
}

适用场景

  • 开发服务器自动重启
  • 长时间运行的监控进程
  • 需要保持服务可用的场景

属性组合和最佳实践

完整配置示例

{
"version": "0.2.0",
"configurations": [
{
// 基础识别属性
"name": "Node.js 开发服务器",
"type": "node",
"request": "launch",

// 程序执行控制
"program": "${workspaceFolder}/src/server.js",
"args": [
"--port", "3000",
"--env", "development"
],
"env": {
"NODE_ENV": "development",
"DEBUG": "app:*",
"DATABASE_URL": "postgresql://localhost:5432/dev"
},
"cwd": "${workspaceFolder}",

// 调试器行为
"stopOnEntry": false,
"console": "integratedTerminal",
"internalConsoleOptions": "openOnSessionStart",

// 生命周期集成
"preLaunchTask": "install-deps",
"postDebugTask": "clean-logs",

// 高级调试控制
"skipFiles": [
"<node_internals>/**",
"${workspaceFolder}/node_modules/**"
],
"sourceMaps": true,
"restart": true,

// 输出控制
"outputCapture": "std"
}
]
}

属性分类总结

类别 属性 重要性 默认值
基础识别 name, type, request 必需
程序执行 program, args, env, cwd 高度推荐 各不同
调试行为 stopOnEntry, console 推荐 false, internalConsole
任务集成 preLaunchTask, postDebugTask 可选
高级控制 skipFiles, sourceMaps, restart 可选 各不同

语言/环境特定属性示例

不同语言的调试器扩展会引入自己特有的属性。

Node.js / JavaScript

  • runtimeExecutable: 指定 Node.js 可执行文件的路径(默认是 node)。
  • runtimeArgs: 传递给 Node.js 运行时本身的参数,例如 ["--inspect-brk"]
  • runtimeVersion: 如果使用 nvm,可以指定一个版本,如 "14"
{
"name": "启动 Node.js 服务器",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": ["--port", "3000"],
"runtimeArgs": ["--nolazy"] // 传递给 node 本身的参数
}

Python

  • python: 指定 Python 解释器的路径。通常由 Python 扩展自动管理。
  • module: 指定要运行的模块(如 flask),而不是一个文件。与 program 二选一。
  • jinja: 是否启用对 Jinja2 模板的调试。
{
"name": "Python: Flask",
"type": "python",
"request": "launch",
"module": "flask",
"args": ["run", "--host=0.0.0.0", "--port=5000"],
"env": {
"FLASK_APP": "${workspaceFolder}/app.py",
"FLASK_ENV": "development"
}
}

C/C++

  • miDebuggerPath: 指定 GDB 或 LLDB 调试器的路径。
  • miDebuggerServerAddress: 连接到远程 gdbserver 的地址。
  • stopAtEntry: 是否在程序入口(main函数)处自动中断。
  • externalConsole: (已废弃,用 console) 是否使用外部控制台。
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/myapp",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}

复合启动配置

compounds 允许你同时启动多个调试配置。例如,同时调试一个前端和一个后端服务。

"compounds": [
{
"name": "启动全栈应用",
"configurations": ["启动后端 API", "启动前端客户端"],
"stopAll": true // 当其中一个配置停止时,停止所有配置
}
]

Golang 语言特定属性

基础 Go 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Go: 调试当前文件",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${fileDirname}",
"env": {
"GOPATH": "${env:GOPATH}",
"GOROOT": "${env:GOROOT}"
},
"args": ["--port", "8080"],
"showLog": true
}
]
}

高级 Go 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Go: 高级调试",
"type": "go",
"request": "launch",

// 运行模式配置
"mode": "debug", // auto, debug, test, remote
"program": "${workspaceFolder}/cmd/api",
"cwd": "${workspaceFolder}",

// 构建和输出配置
"output": "${workspaceFolder}/bin/debug",
"buildFlags": "-tags=json1,debug -ldflags='-X main.version=dev'",
"env": {
"GOOS": "linux",
"GOARCH": "amd64",
"CGO_ENABLED": "0",
"DEBUG": "true",
"DB_HOST": "localhost"
},

// 调试器行为
"stopOnEntry": false,
"logOutput": "rpc,dap,debugger",
"showGlobalVariables": false,

// 远程调试
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",

// 进程参数
"args": [
"--config",
"${workspaceFolder}/config/dev.yaml",
"--verbose"
],

// 测试特定配置
"testFlags": ["-v", "-race"],
"packagePathToGoModPathMap": {
"/app": "${workspaceFolder}"
},

// 调试控制台
"console": "integratedTerminal",
"internalConsoleOptions": "openOnSessionStart"
}
]
}

Go 测试调试配置

{
"configurations": [
{
"name": "Go: 调试测试",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}/pkg/users",
"args": [
"-test.v",
"-test.run",
"TestUserService"
],
"buildFlags": "-race",
"env": {
"TEST_DATABASE_URL": "postgres://test@localhost/test"
}
},
{
"name": "Go: 调试单个测试函数",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${fileDirname}",
"args": [
"-test.v",
"-test.run",
"^${fileBasenameNoExtension}$"
]
}
]
}

Go 模块和依赖调试

{
"configurations": [
{
"name": "Go: 多模块项目",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/main",
"env": {
"GO111MODULE": "on",
"GOPRIVATE": "*.company.com"
},
"buildFlags": "-mod=readonly",
"dlvFlags": ["--check-go-version=false"],
"substitutePath": [
{
"from": "${workspaceFolder}",
"to": "/go/src/project"
}
]
}
]
}

Java 语言特定属性

基础 Java 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Java: 启动当前文件",
"type": "java",
"request": "launch",
"mainClass": "${file}",
"args": [],
"vmArgs": ["-Xmx512m"]
}
]
}

高级 Java 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Java: Spring Boot 应用",
"type": "java",
"request": "launch",

// 主类和项目配置
"mainClass": "com.example.Application",
"projectName": "my-spring-boot-app",
"classPaths": [
"${workspaceFolder}/target/classes",
"${workspaceFolder}/target/dependency/*"
],

// JVM 参数
"vmArgs": [
"-Xmx1024m",
"-Xms512m",
"-Dspring.profiles.active=dev",
"-Dlogging.level.com.example=DEBUG",
"-javaagent:${workspaceFolder}/lib/spring-instrument.jar"
],

// 程序参数
"args": [
"--server.port=8080",
"--spring.config.location=classpath:/application-dev.yml"
],

// 环境变量
"env": {
"DATABASE_URL": "jdbc:postgresql://localhost:5432/dev",
"REDIS_HOST": "localhost"
},

// 调试器配置
"stopOnEntry": false,
"console": "internalConsole",
"internalConsoleOptions": "openOnSessionStart",

// 源路径
"sourcePaths": ["${workspaceFolder}/src/main/java"],

// 高级调试选项
"stepFilters": {
"skipClasses": ["java.lang.*", "sun.*", "com.sun.*"],
"skipSynthetics": true,
"skipStaticInitializers": false,
"skipConstructors": false
},

// 启动前任务
"preLaunchTask": "build",

// 热部署配置
"hotCodeReplace": "auto",
"enableHotCodeReplace": true
}
]
}

Maven/Gradle 项目调试

{
"configurations": [
{
"name": "Java: Maven Spring Boot",
"type": "java",
"request": "launch",
"mainClass": "com.example.DemoApplication",
"projectName": "demo-project",
"vmArgs": [
"-Dspring-boot.run.profiles=dev",
"-Dspring.devtools.restart.enabled=true"
],
"args": [],
"classPaths": [
"${workspaceFolder}/target/classes",
"${workspaceFolder}/target/test-classes"
],
"preLaunchTask": "maven: package"
},
{
"name": "Java: Gradle 应用",
"type": "java",
"request": "launch",
"mainClass": "Application",
"projectName": "gradle-project",
"vmArgs": [
"-Dspring.profiles.active=development"
],
"args": [],
"preLaunchTask": "gradle: build"
}
]
}

Java 测试调试配置

{
"configurations": [
{
"name": "Java: JUnit 测试",
"type": "java",
"request": "launch",
"mainClass": "org.junit.platform.console.ConsoleLauncher",
"args": [
"--scan-classpath",
"${workspaceFolder}/target/test-classes",
"--include-classname",
".*Test",
"--details", "verbose"
],
"vmArgs": [
"-Djunit.jupiter.execution.parallel.enabled=true"
],
"classPaths": [
"${workspaceFolder}/target/test-classes",
"${workspaceFolder}/target/classes"
]
},
{
"name": "Java: 调试当前测试类",
"type": "java",
"request": "launch",
"mainClass": "org.junit.platform.console.ConsoleLauncher",
"args": [
"--select-class",
"${fileBasenameNoExtension}",
"--details",
"tree"
],
"projectName": "${workspaceFolderBasename}",
"preLaunchTask": "maven: test-compile"
}
]
}

企业级 Java 配置

{
"configurations": [
{
"name": "Java: 企业应用服务器",
"type": "java",
"request": "launch",

// 应用服务器配置
"mainClass": "org.apache.catalina.startup.Bootstrap",
"vmArgs": [
"-Dcatalina.base=${workspaceFolder}/tomcat",
"-Dcatalina.home=${workspaceFolder}/tomcat",
"-Djava.io.tmpdir=${workspaceFolder}/tomcat/temp",
"-Djava.endorsed.dirs=${workspaceFolder}/tomcat/endorsed",
"-Dlog4j.configurationFile=file:${workspaceFolder}/config/log4j2.xml",
"-Dcom.sun.management.jmxremote",
"-Dcom.sun.management.jmxremote.port=9010",
"-Dcom.sun.management.jmxremote.ssl=false",
"-Dcom.sun.management.jmxremote.authenticate=false"
],

// 类路径和模块
"classPaths": [
"${workspaceFolder}/tomcat/bin/bootstrap.jar",
"${workspaceFolder}/tomcat/bin/tomcat-juli.jar",
"${workspaceFolder}/webapp/WEB-INF/classes",
"${workspaceFolder}/webapp/WEB-INF/lib/*"
],

// 调试配置
"env": {
"JAVA_OPTS": "-Xmx2048m -XX:+UseG1GC",
"SPRING_CONFIG_LOCATION": "file:${workspaceFolder}/config/"
},

// 远程调试支持
"hostName": "localhost",
"port": 8000,

// 启动前准备
"preLaunchTask": "deploy-to-tomcat",
"postDebugTask": "undeploy-from-tomcat"
}
]
}

Node.js 语言特定属性

基础 Node.js 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Node.js: 启动当前文件",
"type": "node",
"request": "launch",
"program": "${file}",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"args": ["--port", "3000"]
}
]
}

高级 Node.js 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Node.js: Express 服务器",
"type": "node",
"request": "launch",

// 程序入口和参数
"program": "${workspaceFolder}/src/app.js",
"args": ["--env", "development", "--cluster", "false"],
"cwd": "${workspaceFolder}",

// 运行时配置
"runtimeExecutable": "/usr/local/bin/node",
"runtimeVersion": "18", // 使用 nvm 版本
"runtimeArgs": [
"--preserve-symlinks",
"--max-old-space-size=4096",
"--trace-warnings"
],

// 环境变量
"env": {
"NODE_ENV": "development",
"DEBUG": "app:*",
"PORT": "3000",
"DATABASE_URL": "postgresql://localhost:5432/dev",
"REDIS_URL": "redis://localhost:6379"
},

// 进程控制
"autoAttachChildProcesses": true,
"stopOnEntry": false,
"restart": true,

// 源映射和转译
"sourceMaps": true,
"outFiles": [
"${workspaceFolder}/dist/**/*.js",
"${workspaceFolder}/build/**/*.js"
],
"sourceMapPathOverrides": {
"webpack:///./*": "${workspaceFolder}/*",
"webpack:///src/*": "${workspaceFolder}/src/*"
},

// 跳过文件
"skipFiles": [
"<node_internals>/**",
"${workspaceFolder}/node_modules/**",
"**/test/**"
],

// 控制台和输出
"console": "integratedTerminal",
"outputCapture": "std",

// 调试器行为
"showAsyncStacks": true,
"pauseForSourceMap": false
}
]
}

Node.js 框架特定配置

{
"configurations": [
{
"name": "Node.js: NestJS 应用",
"type": "node",
"request": "launch",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "start:debug"],
"console": "integratedTerminal",
"restart": true,
"env": {
"NODE_ENV": "development",
"TS_NODE_PROJECT": "${workspaceFolder}/tsconfig.json"
},
"sourceMaps": true,
"skipFiles": ["<node_internals>/**", "**/node_modules/**"]
},
{
"name": "Node.js: Next.js 开发服务器",
"type": "node",
"request": "launch",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev"],
"console": "integratedTerminal",
"env": {
"NODE_OPTIONS": "--inspect"
},
"port": 9229,
"sourceMaps": true
},
{
"name": "Node.js: React 开发服务器",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/react-scripts",
"args": ["start"],
"env": {
"BROWSER": "none",
"PORT": "3000"
},
"console": "integratedTerminal"
}
]
}

Node.js 测试调试配置

{
"configurations": [
{
"name": "Node.js: Jest 测试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": [
"--runInBand",
"--no-cache",
"--watchAll=false",
"${fileBasenameNoExtension}"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"env": {
"NODE_ENV": "test",
"CI": "true"
}
},
{
"name": "Node.js: Mocha 测试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/mocha",
"args": [
"--require",
"ts-node/register",
"--timeout",
"999999",
"--colors",
"${file}"
],
"console": "integratedTerminal",
"env": {
"NODE_ENV": "test"
}
},
{
"name": "Node.js: 调试当前测试文件",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": [
"${file}",
"--config",
"${workspaceFolder}/jest.config.js",
"--no-cache",
"--runInBand"
],
"console": "integratedTerminal"
}
]
}

Node.js 微服务和容器调试

{
"configurations": [
{
"name": "Node.js: Docker 容器调试",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app",
"restart": true,
"sourceMaps": true,
"sourceMapPathOverrides": {
"/app/*": "${workspaceFolder}/*"
},
"skipFiles": [
"<node_internals>/**",
"/app/node_modules/**"
]
},
{
"name": "Node.js: Kubernetes Pod 调试",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/usr/src/app",
"restart": false,
"sourceMaps": true
},
{
"name": "Node.js: 远程服务器调试",
"type": "node",
"request": "attach",
"port": 9229,
"address": "192.168.1.100",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/www/app",
"timeout": 30000
}
]
}

Node.js TypeScript 调试

{
"configurations": [
{
"name": "Node.js: TypeScript 开发",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/index.ts",
"runtimeArgs": [
"--loader",
"ts-node/esm",
"--preserve-symlinks"
],
"env": {
"TS_NODE_PROJECT": "${workspaceFolder}/tsconfig.json",
"NODE_ENV": "development"
},
"console": "integratedTerminal",
"sourceMaps": true,
"skipFiles": ["<node_internals>/**"],
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/**"
]
}
]
}

VS Code launch.json 占位符详细说明

基础路径占位符

工作区相关占位符

{
"configurations": [
{
"name": "工作区示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",
"cwd": "${workspaceFolder}",
"env": {
"PROJECT_ROOT": "${workspaceFolder}",
"PROJECT_NAME": "${workspaceFolderBasename}"
},
"args": [
"--config",
"${workspaceFolder}/config/dev.json"
]
}
]
}

详细说明:

  • ${workspaceFolder}

    • 含义:当前在 VS Code 中打开的文件夹的绝对路径
    • 示例值/Users/username/projects/my-app
    • 使用场景:引用项目根目录下的文件
    • 注意事项:在多工作区环境中,可以使用 ${workspaceFolder:FolderName} 指定特定工作区
  • ${workspaceFolderBasename}

    • 含义:工作区文件夹的名称(不包含路径)
    • 示例值my-app
    • 使用场景:在环境变量或参数中使用项目名称

当前文件相关占位符

{
"configurations": [
{
"name": "文件相关示例",
"type": "python",
"request": "launch",
"program": "${file}", // 当前打开的文件
"cwd": "${fileDirname}", // 当前文件所在目录
"args": [
"--input", "${fileDirname}/input.txt",
"--output", "${fileDirname}/output/${fileBasenameNoExtension}.out"
],
"env": {
"CURRENT_FILE": "${fileBasename}",
"CURRENT_MODULE": "${fileBasenameNoExtension}"
}
}
]
}

详细说明:

  • ${file}

    • 含义:当前在编辑器中激活的文件的完整路径
    • 示例值/Users/username/projects/my-app/src/main.py
    • 使用场景:调试当前正在编辑的文件
  • ${fileDirname}

    • 含义:当前文件所在的目录路径
    • 示例值/Users/username/projects/my-app/src
    • 使用场景:设置工作目录或引用同级文件
  • ${fileBasename}

    • 含义:当前文件的完整文件名(包含扩展名)
    • 示例值main.py
    • 使用场景:在参数或环境变量中使用文件名
  • ${fileBasenameNoExtension}

    • 含义:当前文件的文件名(不包含扩展名)
    • 示例值main
    • 使用场景:生成输出文件名或模块名
  • ${fileExtname}

    • 含义:当前文件的扩展名
    • 示例值.py
    • 使用场景:根据文件类型执行不同逻辑
  • ${relativeFile}

    • 含义:当前文件相对于工作区文件夹的相对路径
    • 示例值src/main.py
    • 使用场景:显示更友好的路径信息

位置和选择相关占位符

{
"configurations": [
{
"name": "位置相关示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
"--start-line", "${lineNumber}",
"--selected-text", "${selectedText}"
],
"env": {
"DEBUG_LINE": "${lineNumber}",
"DEBUG_COLUMN": "${selectedText}"
}
}
]
}

详细说明:

  • ${lineNumber}

    • 含义:编辑器中光标当前所在的行号
    • 示例值42
    • 使用场景:从特定行开始调试或设置断点
  • ${selectedText}

    • 含义:当前在编辑器中选中的文本内容
    • 示例值functionName
    • 使用场景:将选中的标识符作为参数传递
    • 注意事项:如果未选中文本,该变量可能为空

环境变量占位符

系统环境变量

{
"configurations": [
{
"name": "环境变量示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"env": {
"PATH": "${env:PATH}",
"HOME": "${env:HOME}",
"USER": "${env:USER}",
"NODE_PATH": "${env:NODE_PATH}:/custom/path",
"COMPOSITE_VAR": "${env:HOME}/projects/${workspaceFolderBasename}"
},
"args": [
"--user-home", "${env:HOME}",
"--temp-dir", "${env:TMPDIR}"
]
}
]
}

详细说明:

  • ${env:VARIABLE_NAME}
    • 含义:引用操作系统的环境变量
    • 示例${env:PATH}, ${env:HOME}, ${env:USER}
    • 使用场景
      • 继承系统路径配置
      • 访问用户目录
      • 使用系统特定的配置
    • 注意事项
      • 如果环境变量不存在,会被替换为空字符串
      • 在 Windows 和 Unix 系统上环境变量名称可能不同

VS Code 配置变量

{
"configurations": [
{
"name": "配置变量示例",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/app.py",
"pythonPath": "${config:python.pythonPath}",
"env": {
"EDITOR_FONT_SIZE": "${config:editor.fontSize}",
"THEME": "${config:workbench.colorTheme}",
"TAB_SIZE": "${config:editor.tabSize}"
},
"args": [
"--theme", "${config:workbench.colorTheme}",
"--font-size", "${config:editor.fontSize}"
]
}
]
}

详细说明:

  • ${config:setting.name}
    • 含义:引用 VS Code 用户设置或工作区设置
    • 示例
      • ${config:python.pythonPath} - Python 解释器路径
      • ${config:editor.fontSize} - 编辑器字体大小
      • ${config:workbench.colorTheme} - 当前主题
    • 使用场景
      • 使用用户在 VS Code 中配置的路径
      • 根据编辑器设置调整程序行为
    • 查找方法:在 VS Code 设置中搜索想要的设置项,点开设置文件可以看到具体的设置名称

输入变量 (Input Variables)

基本输入类型

{
"version": "0.2.0",
"configurations": [
{
"name": "输入变量示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
"--environment", "${input:environment}",
"--log-level", "${input:logLevel}",
"--user", "${input:username}",
"--config-file", "${input:configFile}"
],
"env": {
"DEPLOY_ENV": "${input:environment}",
"USER_NAME": "${input:username}"
}
}
],
"inputs": [
{
"id": "environment",
"type": "pickString",
"description": "选择部署环境",
"options": [
"development",
"staging",
"production"
],
"default": "development"
},
{
"id": "logLevel",
"type": "pickString",
"description": "选择日志级别",
"options": [
{"label": "🔴 ERROR", "value": "error"},
{"label": "🟡 WARN", "value": "warn"},
{"label": "🔵 INFO", "value": "info"},
{"label": "🟢 DEBUG", "value": "debug"}
],
"default": "info"
},
{
"id": "username",
"type": "promptString",
"description": "输入用户名",
"default": "anonymous"
},
{
"id": "configFile",
"type": "pickString",
"description": "选择配置文件",
"options": [
"${workspaceFolder}/config/dev.json",
"${workspaceFolder}/config/test.json",
"${workspaceFolder}/config/prod.json"
]
}
]
}

高级输入类型

{
"inputs": [
{
"id": "commandInput",
"type": "command",
"command": "workbench.action.quickOpen",
"args": ">Select file: "
},
{
"id": "multiStepInput",
"type": "promptString",
"description": "多步骤输入示例 - 第一步",
"default": "step1"
},
{
"id": "fileBrowser",
"type": "pickString",
"description": "选择文件",
"options": [
"${workspaceFolder}/src/main.js",
"${workspaceFolder}/src/utils.js",
"${workspaceFolder}/tests/test.js"
]
}
]
}

输入类型详解:

  • promptString

    • 用途:显示文本输入框让用户输入字符串
    • 属性description, default, password(设为 true 可隐藏输入)
    • 示例:输入用户名、密码、API密钥等
  • pickString

    • 用途:显示下拉列表让用户选择预定义选项
    • 属性description, options(数组或对象数组), default
    • 示例:选择环境、日志级别、配置文件
  • command

    • 用途:执行 VS Code 命令并获取结果
    • 属性command, args
    • 示例:打开文件选择器、获取当前分支等

命令变量 (Command Variables)

{
"configurations": [
{
"name": "命令变量示例",
"type": "node",
"request": "launch",
"program": "${command:extension.node-debug.pickWorkspaceFolder}/app.js",
"cwd": "${command:extension.node-debug.pickWorkspaceFolder}",
"args": [
"--git-branch", "${command:git.getCurrentBranch}",
"--active-file", "${command:extension.filepath}"
],
"env": {
"CURRENT_BRANCH": "${command:git.getCurrentBranch}",
"PROJECT_SELECTED": "${command:extension.node-debug.pickWorkspaceFolder}"
}
}
]
}

常用命令变量:

  • ${command:extension.node-debug.pickWorkspaceFolder}

    • 让用户选择工作区文件夹
  • ${command:git.getCurrentBranch}

    • 获取当前 Git 分支名称(需要 Git 扩展)
  • ${command:extension.filepath}

    • 获取当前文件路径

复合和条件占位符

条件表达式

{
"configurations": [
{
"name": "条件占位符示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
// 条件参数:如果文件存在则使用,否则使用默认值
"${command:fileExists,'${workspaceFolder}/config/local.json'}? '--config local.json' : '--config default.json'",

// 基于平台的参数
"${command:isWindows}? '--platform windows' : '--platform unix'"
],
"env": {
// 条件环境变量
"SPECIAL_FEATURE": "${command:fileExists,'${workspaceFolder}/features/advanced.js'}? 'enabled' : 'disabled'",

// 平台特定路径
"TEMP_DIR": "${command:isWindows}? 'C:\\\\Temp' : '/tmp'"
}
}
]
}

复合路径构建

{
"configurations": [
{
"name": "复合路径示例",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/src/${fileBasenameNoExtension}.py",
"cwd": "${workspaceFolder}/build/${input:buildType}",
"args": [
"--output",
// 构建复杂输出路径
"${workspaceFolder}/dist/${input:buildType}/${fileDirname}/${fileBasenameNoExtension}.out",

"--logs",
"${workspaceFolder}/logs/${env:USER}/${fileBasenameNoExtension}.log"
],
"env": {
"CACHE_DIR": "${env:HOME}/.cache/${workspaceFolderBasename}",
"DATA_PATH": "${workspaceFolder}/data/${input:dataset}"
}
}
],
"inputs": [
{
"id": "buildType",
"type": "pickString",
"options": ["debug", "release"],
"default": "debug"
},
{
"id": "dataset",
"type": "promptString",
"description": "输入数据集名称",
"default": "training"
}
]
}

多工作区占位符

{
"configurations": [
{
"name": "多工作区示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder:backend}/server.js",
"cwd": "${workspaceFolder:backend}",
"args": [
"--frontend-path", "${workspaceFolder:frontend}/dist",
"--shared-lib", "${workspaceFolder:shared-lib}/dist"
],
"env": {
"BACKEND_ROOT": "${workspaceFolder:backend}",
"FRONTEND_ROOT": "${workspaceFolder:frontend}",
"SHARED_ROOT": "${workspaceFolder:shared-lib}",
"COMPOSITE_PATH": "${workspaceFolder:backend}:${workspaceFolder:frontend}"
}
}
]
}

实用技巧和最佳实践

错误处理和回退

{
"configurations": [
{
"name": "容错配置示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",
"args": [
// 使用环境变量,如果不存在则使用默认值
"--api-key", "${env:API_KEY:default-key}",

// 检查文件存在性
"${command:fileExists,'${workspaceFolder}/config/custom.json'}? '--config custom.json' : '--config default.json'"
],
"env": {
// 环境变量回退机制
"DATABASE_URL": "${env:DATABASE_URL:sqlite://./default.db}",
"LOG_LEVEL": "${env:LOG_LEVEL:info}"
}
}
]
}

调试配置验证

{
"configurations": [
{
"name": "验证示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",

// 添加验证注释(不会被执行,仅供文档)
"_comment": "此配置需要以下文件存在: ${workspaceFolder}/package.json, ${workspaceFolder}/src/app.js",

"args": [
"--config",
// 验证配置文件存在
"${command:fileExists,'${workspaceFolder}/config/prod.json'}? 'config/prod.json' : 'config/dev.json'"
],

"env": {
// 验证必要环境变量
"REQUIRED_VAR": "${env:REQUIRED_API_KEY}",
"OPTIONAL_VAR": "${env:OPTIONAL_SETTING:default_value}"
}
}
]
}

性能优化技巧

{
"configurations": [
{
"name": "性能优化示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",

// 避免在热路径中使用复杂命令变量
"args": [
"--simple-arg", "value", // 直接值
"--file-arg", "${file}" // 简单变量
],

// 预计算复杂路径
"env": {
"COMPLEX_PATH": "${workspaceFolder}/build/${input:buildType}/output"
},

// 使用输入变量减少交互
"preLaunchTask": "precompute-variables"
}
],
"inputs": [
{
"id": "buildType",
"type": "pickString",
"options": ["debug", "release"],
"default": "debug"
}
]
}

实际应用场景

多环境部署配置

{
"version": "0.2.0",
"configurations": [
{
"name": "多环境应用",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",
"args": [
"--env", "${input:deployEnvironment}",
"--config", "${workspaceFolder}/config/${input:deployEnvironment}.json"
],
"env": {
"NODE_ENV": "${input:deployEnvironment}",
"API_BASE_URL": "${input:apiBaseUrl}",
"DATABASE_URL": "${input:databaseUrl}"
}
}
],
"inputs": [
{
"id": "deployEnvironment",
"type": "pickString",
"description": "选择部署环境",
"options": [
{
"label": "🟢 开发环境",
"value": "development"
},
{
"label": "🟡 测试环境",
"value": "testing"
},
{
"label": "🔴 生产环境",
"value": "production"
}
]
},
{
"id": "apiBaseUrl",
"type": "promptString",
"description": "输入 API 基础 URL",
"default": "http://localhost:3000"
},
{
"id": "databaseUrl",
"type": "promptString",
"description": "输入数据库连接 URL",
"default": "postgresql://localhost:5432/dev"
}
]
}