У меня есть конфигурация запуска отладки (launch.json), как показано ниже.
{
"version": "0.2.0",
"configurations": [
{
"name": "Current TS File",
"type": "node",
"request": "launch",
"preLaunchTask": "Pre Debug Task",
"postDebugTask": "Stop Watch Styles",
"args": ["${relativeFile}"],
"runtimeArgs": ["--nolazy", "-r", "ts-node/register"],
"sourceMaps": true,
"cwd": "${workspaceRoot}",
"protocol": "inspector",
}
]
}
Конфигурация моих задач (tasks.json) похожа на
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "next:copy",
"label": "Copy Files",
"problemMatcher": []
},
{
"type": "npm",
"script": "styles:tsw",
"label": "Watch Styles",
"problemMatcher": [],
},
{
"label": "Pre Debug Task",
"isBackground": true,
"dependsOn" :[
"Copy Files",
"Watch Styles"
]
},
{
"label": "Stop Watch Styles",
// No sure what should come here
}
]
}
Пытаясь остановить процесс наблюдения в postDebugTask, есть ли способ завершить задачу, указав имя (Watch Styles) в качестве параметра в tasks.json. Просмотр стилей – это непрерывно работающий процесс. Предложите другой способ завершения задачи после завершения отладки.





Это работает для меня:
{
"label": "postdebugKill",
"type": "process",
"command":[
"${command:workbench.action.tasks.terminate}",
"${command:workbench.action.acceptSelectedQuickOpenItem}",
],
},
Первый "${command:workbench.action.tasks.terminate}" вызовет панель с предложением выбрать, какую задачу завершить. Поэтому, если у вас было несколько запущенных задач и вы хотели выбрать одну, вы должны использовать только эту команду.
Второй "${command:workbench.action.acceptSelectedQuickOpenItem}" завершит выбранную задачу на упомянутой выше панели. (Поэтому вы даже не увидите панель завершения.) Если у вас есть только одна запущенная задача, когда вы вызываете задачу postdebugKill, она будет выбрана автоматически и, таким образом, завершена. В противном случае та задача, которая указана первой, будет прекращена. Опять же, если у вас запущено несколько других задач, и вы хотите выбрать, какую из них завершить, не включайте эту вторую команду.
Я не знаю, как указать, возможно, через опцию args, имя метки, для которой задача должна быть завершена, если она запущена. Было бы неплохо иметь этот функционал.
[Имя postdebugKill может быть каким угодно.]
Чтобы вызвать задачу после отладки, ваша конфигурация launch.json может выглядеть так:
{
"type": "node",
"request": "launch",
"name": "Gulp: serve",
"program": "${workspaceFolder}/node_modules/gulp/bin/gulp.js",
"args": [
"serve"
],
// "preLaunchTask": "someTask",
"postDebugTask": "postdebugKill"
},
После остановки этого сеанса отладки "Gulp: serve" будет запущена задача "postdebugKill". И поэтому, если бы я использовал "preLaunchTask" для запуска задачи или просто запустил задачу до запуска сеанса отладки "Gulp: serve" - этот preLaunchTask был бы завершен.
Недавно в vscode была добавлена возможность запускать команды vscode в задаче. Некоторая минимальная информация здесь: с помощью команды в документе задачи.
Я использую 1.30.2. Я провел некоторое исследование, и я помещу его в отдельный ответ.
Когда я пытаюсь запустить эту задачу вручную, VS Code просто открывает терминал и регистрирует The terminal shell path "${command:workbench.action.tasks.terminate} ${command:workbench.action.acceptSelectedQuickOpenItem}" does not exist. Я использую VS Code версии 1.42.1.
[Я добавлю еще один ответ, потому что новая дополнительная информация обширна.]
Кажется, есть проблема с запуском preLaunchTask и последующим запуском сеанса отладки. См., в частности, отладка не работает с первого раза. Похоже, что это исправлено в инсайдерской версии и может быть выпущено в начале февраля 2019 года. терминал не отправляет onLineData.
Тем временем есть предлагаемое исправление в одной из проблем, на которую я потерял ссылку, и это средство сопоставления проблем, которое будет сигнализировать отладчику о завершении зависимых задач.
В моей задаче просмотра я использовал это:
"problemMatcher": [
{
"base": "$tsc-watch",
"background": {
"activeOnStart": true,
"beginsPattern": "Using gulpfile ~\\OneDrive\\experimental\\gulpfile.js",
"endsPattern": "Starting 'watch'..."
}
}
],
Я выбрал это, потому что, когда я вручную запускаю задачу gulp:watch, я получаю это в терминале:
[22:27:48] Using gulpfile ~\OneDrive\experimental\gulpfile.js
[22:27:48] Starting 'watch'...
[22:27:48] Starting 'watch'...
Итак, вы видите начальный и конечный шаблоны, которые я скопировал (с дополнительным экранированием).
Я предлагаю вам отдельно запустить «Предварительную отладочную задачу» и скопировать начальный и конечный вывод в «Предварительную отладочную задачу» ProblemMatcher и посмотреть, работает ли она теперь.
Мой код в первом ответе, который я считаю правильным, я просто не использовал «isBackground» и «dependsOn», как вы. Но я добавил к моему "isBackground" и вариант problemMatcher, и теперь он работает безупречно.
Надеемся, что это будет исправлено в следующем выпуске за февраль 2019 года, и этот обходной путь не понадобится.
Спасибо, Марк, за то, что уделил мне время, мне нужно проверить мою задачу наблюдения, пытаясь определить шаблон, который можно поместить в ProblemMatcher. Я хотел бы, чтобы это было проще :). Вероятно, я бы дождался отдельного ответа, который вы предложили дать.
Это был второй ответ. Это «может быть» исправлено уже 6 февраля 2019 года, когда может быть выпущено следующее обновление vscode.
Это завершит все задачи после остановки отладки.
Или в данном случае просто build_runner watch...
запуск.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Flutter",
"request": "launch",
"type": "dart",
"flutterMode": "debug",
"preLaunchTask": "flutter: build_runner watch",
"postDebugTask": "Terminate All Tasks"
}
]
}
задачи.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Terminate All Tasks",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
}
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "terminateAll"
}
]
}
Подробнее здесь: https://code.visualstudio.com/docs/editor/variables-reference#_command-переменные
Спасибо за ваш ответ. Какая у вас версия VS Code. Моя версия 1.29.1, я пытался добавить команды в раздел пост-отладки, мне не предлагалось завершить задачу. Я видел заявление в терминале. Я останавливаю задачу отладки с помощью Shift+F5 или использую значок «Стоп» для отладки
> Executing task in folder my-app-folder: C:\Users\sandeep\Codebase\my-app-folder\${command:workbench.action.tasks.terminate} ${command:workbench.action.acceptSelectedQuickOpenItem}