Чтобы передать аргументы командной строки программе на Node.js при её отладке на Mac, добавьте массив args в конфигурацию запуска VS Code. Поместите каждый аргумент в отдельную строку, затем запустите эту конфигурацию с помощью клавиши F5. Это передаст значения напрямую в программу; zsh не будет интерпретировать этот массив как команду оболочки.

Добавление массива args в launch.json

Откройте папку проекта в VS Code. Если в ней ещё нет конфигурации запуска, откройте «Запуск и отладка» с помощью ⇧⌘D, выберите создать файл launch.json и выберите отладчик для вашей среды выполнения. VS Code сохранит конфигурацию рабочей области в файле .vscode/launch.json. Запрос launch запускает новый процесс, а запрос attach подключается к уже работающему; поэтому используйте launch, когда VS Code должен сам запустить программу с вашими аргументами. Настройка отладки в 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 предоставляет дополнительные значения командной строки. Расширение отладчика определяет поддерживаемые свойства для каждой среды выполнения; если вы используете другой отладчик или видите ошибку валидации, обратитесь к подсказкам IntelliSense в launch.json. Настройка отладки в Visual Studio Code

Сохранение пробелов и специальных символов

В массиве args каждый элемент является отдельным аргументом. В документации VS Code указано, что путь, содержащий пробелы, остается единой строкой после подстановки переменных. Соответственно, путь к файлу в примере представляет собой один аргумент; не нужно дополнительно обрамлять его экранированными кавычками только для того, чтобы сохранить пробел. Переменная ${workspaceFolder} указывает на папку, открытую в VS Code, что сохраняет привязку пути к проекту. Справочник по переменным

Это отличается от ручного ввода команды в Терминале. В macOS в качестве оболочки по умолчанию для Терминала используется zsh, однако массив args в конфигурации запуска представляет собой аргументы целевого процесса. Синтаксис оболочки, такой как *, > или |, здесь автоматически не раскрывается и не выполняется. Например, если вашей программе требуется буквальное значение a&b.txt, запишите его в виде единой строки JSON: "a&b.txt". Для раскрытия оболочки или перенаправления потоков целевой процесс должен явно запускаться через оболочку, при этом точное поведение зависит от расширения отладчика; в документации VS Code отмечается, что универсального синтаксиса перенаправления для всех конфигураций отладки не существует. Apple: Изменение оболочки по умолчанию в Терминале на Mac и Настройка отладки в 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 поддерживает переменные ввода promptString в launch.json. Добавьте массив inputs на том же верхнем уровне, что и configurations, а затем сошлитесь на этот ввод внутри args:

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

Поле ввода возвращает строку, которая подставляется в элемент аргумента. Это удобно для одиночного значения, меняющегося при каждом запуске. Вложенность переменных ввода не поддерживается, а диалоговое окно ввода не разбивает введенную командную строку оболочки на несколько отдельных аргументов. Если вам нужно передать несколько значений, задайте несколько элементов массива или используйте более подходящий подход, специфичный для вашего отладчика. Справочник по переменным

Устранение неполадок: аргументы не распознаются

Сначала убедитесь, что выбрана правильная конфигурация и тип запроса установлен в launch. Затем проверьте, что список аргументов указан в поддерживаемом отладчиком свойстве args, что запятые и кавычки образуют корректный JSON и что ваша программа ожидает эти значения именно в таком порядке. Также проверьте cwd: относительный путь интерпретируется программой относительно ее рабочего каталога, в то время как ${workspaceFolder} задает начальную точку в корне проекта. Если процесс запуска ведет себя неожиданно, VS Code рекомендует проверить program, cwd, args и свойства, поддерживаемые выбранным отладчиком. Настройка отладки в Visual Studio Code

Для повторяемого процесса отладки на Mac сохраняйте аргументы в конфигурации запуска рабочей области, используйте отдельный элемент массива JSON для каждого требуемого значения и проверяйте, что именно получает ваша среда выполнения. Воспринимайте экранирование кавычек в оболочке как отдельную задачу: оно применяется, когда командную строку парсит оболочка, в то время как args является конфигурацией непосредственно для запускаемой программы.

Источники