launch.json文件
什么是 launch.json
launch.json
文件位于项目根目录的 .vscode
文件夹下。它的主要作用是告诉 VS Code 的调试器:
- 如何启动你的程序(例如,使用哪个解释器/运行时,传递什么参数)。
- 如何附加到已经运行的程序上进行调试。
- 为不同的编程语言和运行时环境(Node.js, Python, C++, Go, .NET等)提供定制化的调试配置。
简而言之,它让你可以按 F5 键就能一键启动一个复杂的调试会话,而无需在终端中输入一长串命令。
如何创建 launch.json
- 在 VS Code 中打开你的项目文件夹。
- 切换到 “运行和调试” 视图(快捷键
Ctrl+Shift+D
或 Cmd+Shift+D
on Mac)。
- 点击 “创建一个 launch.json 文件”。
- VS Code 会尝试检测你的项目类型(如 Python, Node.js)并提供相应的模板。选择一个,它会自动生成一个初始的
launch.json
文件。
launch.json 的整体结构
一个典型的 launch.json
文件包含一个 配置数组,名为 configurations
,里面可以包含多个调试配置。你还可以有一个顶级的 version
属性和一个可选的 compounds
属性(用于同时启动多个配置)。
{ "version": "0.2.0", "configurations": [ { "name": "Python: 当前文件", "type": "python", "request": "launch", }, { "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", "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", "args": ["--production"] }
|
配合 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>/**", "${workspaceFolder}/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"] }
|
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", "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/*" ], "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", "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" ] } ] }
|
详细说明:
当前文件相关占位符
{ "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}" } } ] }
|
详细说明:
位置和选择相关占位符
{ "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 设置中搜索想要的设置项,点开设置文件可以看到具体的设置名称
基本输入类型
{ "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}
${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" } ] }
|