要在 Mac 上调试 Node.js 程序时传递命令行参数,请在其 VS Code 启动配置中添加一个 args 数组。将每个参数放在单独的字符串中,然后使用 F5 启动该配置。这会将值直接传递给程序;它不会让 zsh 将该数组解释为 Shell 命令。

向 launch.json 添加 args 数组

在 VS Code 中打开项目文件夹。如果尚未配置启动文件,请使用 ⇧⌘D 打开“运行和调试”,选择创建 launch.json 文件,并选择适用于您运行时的调试器。VS Code 会将工作区配置保存在 .vscode/launch.json 中。launch 请求会启动一个新进程;而 attach 请求会连接到已在运行的进程,因此当需要 VS Code 带着您的参数启动程序时,请使用 launch。在 Visual Studio Code 中配置调试

对于这个具体示例,假设工作区包含 app.js,并且您希望使用 --input 后跟一个可能包含空格的文件路径,再加上一个 --verbose 标志来运行它。在 configurations 数组中添加或调整以下配置:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Debug app with input file",
      "program": "${workspaceFolder}/app.js",
      "cwd": "${workspaceFolder}",
      "args": [
        "--input",
        "${workspaceFolder}/data files/input.txt",
        "--verbose"
      ]
    }
  ]
}

在“运行和调试”配置选择器中选择 Debug app with input file,然后按 F5。program 用于指定 JavaScript 入口点,cwd 设置工作目录,而 args 提供额外的命令行值。调试器扩展为每个运行时定义了支持的属性;如果您使用的是其他调试器或看到验证错误,请检查 launch.json 中的 IntelliSense。在 Visual Studio Code 中配置调试

保持空格和特殊字符完好无损

在数组格式的 args 中,每个元素都是一个参数。VS Code 文档指出,包含空格的路径在变量替换后仍保持为单个字符串。因此,示例中的文件路径是一个参数;不要仅为了保留空格而在其周围添加转义的引号。${workspaceFolder} 会解析为在 VS Code 中打开的文件夹,从而使路径与项目保持关联。变量参考

这与在终端中输入命令不同。macOS 使用 zsh 作为终端的默认 Shell,但启动配置中的 args 数组代表目标进程的参数。Shell 语法(例如 *、> 或 |)在其中不会被自动展开或执行。例如,如果您的程序需要字面值 a&b.txt,请将其编写为单个 JSON 字符串:"a&b.txt"。若要进行 Shell 展开或重定向,目标必须显式通过 Shell 运行,具体行为取决于调试器扩展;VS Code 指出,不存在适用于所有调试配置的通用重定向语法。Apple:在 Mac 上的“终端”中更改默认 Shell 和 在 Visual Studio Code 中配置调试

确认程序接收到的内容

对于 Node.js,进程通过 process.argv 公开启动参数。前两项分别代表 Node 可执行文件和脚本路径;其余项是额外的值。若要临时检查它们,请将以下代码添加到 app.js:

console.log(process.argv);

使用示例配置时,输出应包含 --input、以 data files/input.txt 结尾的解析路径以及作为独立项的 --verbose。这是一种实用的方法,可以判断问题出在 VS Code 的配置中还是程序的参数解析中。确认这些值后,请移除或调整诊断输出。Node.js:Process

每次调试时提示输入值

如果值在各次运行之间会发生变化,VS Code 支持在 launch.json 中使用 promptString 输入变量。在与 configurations 相同的顶层添加一个 inputs 数组,然后在 args 内部引用该输入:

"args": ["--input", "${input:inputFile}"],
"inputs": [
  {
    "id": "inputFile",
    "type": "promptString",
    "description": "Path to the input file",
    "default": "data files/input.txt"
  }
]

该提示会返回一个字符串,并替换到参数元素中。这对于每次运行的单个简单值非常有用。不支持输入变量嵌套,并且输入提示不会将 Shell 命令行解析为多个参数。如果您需要多个值,请定义多个数组元素或使用更合适且特定于调试器的方法。变量参考

排查似乎缺失的参数

首先确认选择了正确的配置,并且请求类型为 launch。然后检查参数列表是否位于调试器支持的 args 属性中,其逗号和引号是否构成有效的 JSON,以及程序是否按提供的顺序接收这些值。此外还要验证 cwd:相对路径由程序根据其工作目录进行解释,而 ${workspaceFolder} 提供了项目根目录作为起点。当启动行为不符合预期时,VS Code 建议检查 program、cwd、args 以及所选调试器支持的属性。在 Visual Studio Code 中配置调试

为了在 Mac 上实现可复现的调试运行,请将参数存储在工作区的启动配置中,每个目标值使用一个 JSON 数组元素,并检查运行时实际接收到的内容。将 Shell 引号处理视为一个单独的问题:它适用于 Shell 解析命令时,而 args 是所启动程序的配置。

参考来源