Завершить другую задачу из поста DebugTask - VS Code
У меня есть конфигурация запуска отладки (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. Просмотр стилей - это непрерывно работающий процесс, пожалуйста, предложите, если есть какой-либо другой подход для завершения задачи после завершения отладки.
5 ответов
Это завершит все задачи после остановки отладки
Или в этом случае просто build_runner watch
...
launch.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"
}
]
}
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
Это работает для меня:
{
"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
имя может быть как угодно.]
Для вызова задачи postdebug ваша конфигурация 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. Некоторая минимальная информация здесь: использование команды в задании.
Если в Linux или macOS менее хакерское решение, которое просто работает, использует . Если в Windows, см. ниже.
Сначала запустите задачу и найдите полную команду vscode, запускаемую для этой задачи, с$ ps -af
Затем используйте + полную команду вpostDebugTask
.
у меня есть запись вtasks.json
так:
{
"label": "stop npm:watch",
"type": "shell",
"command": "pkill -f 'sh -c node ./scripts/watch.js'",
"presentation": {
"reveal": "silent",
"panel": "dedicated",
"close": true,
}
}
'sh -c node ./scripts/watch.js'
как vscode запускает мойnpm:watch
задача.
The presentation
свойства не позволяют этой задаче получить фокус или занять место на терминале после ее успешного завершения.
Затем вы ссылаетесь на эту задачу вlaunch.json
конфигурация:
{
...
"preLaunchTask": "npm:watch",
"postDebugTask": "stop npm:watch",
...
}
Если полная команда содержит изменяющиеся параметры (пути, номера портов и т. д.), вы можете использовать часть команды или регулярное выражение.
например: я мог бы, вероятно, совпадать с'./scripts/watch.js'
или'node.*watch'
.
Для Windows: вы можете заставить это работать, заменивpkill
дляtaskkill
.
Если вы хотите поддерживать как Unix, так и Windows, вы можете создать сценарий, который выполняет одно или другое в зависимости от базовой ОС.
[Я добавлю другой ответ, потому что новая дополнительная информация обширна.]
Кажется, есть проблема с запуском 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'...
Итак, вы видите начальный и конечный шаблон, который я скопировал (с дополнительным экранированием).
Я предлагаю вам отдельно запустить "Предварительную задачу отладки", скопировать начальный и конечный выходные данные в свою задачу "Предварительная задача отладки" и посмотреть, работает ли она сейчас.
Мой код в первом ответе, который я считаю правильным, я просто не использовал "isBackground" и "зависящий от", как вы. Но я добавил "isBackground"
к моему и тому problemMatcher
вариант и теперь работает без нареканий.
Надеюсь, это будет исправлено в следующем выпуске февраля 2019 года, и в этом не будет необходимости.
Вот что получилось в моем проекте Vite+React+Typescript; Я хотел автоматически завершить работу сервера разработки при остановке отладчика.
задачи.json —
{
"version": "2.0.0",
"tasks": [
{
"label": "npm dev", // the name of the task to be executed when I press'F5'. The 'terminate' command terminates this task.
"isBackground": true,
"type": "npm",
"script": "dev",
"problemMatcher": {
"owner": "typescript",
"fileLocation": "relative",
"pattern": {
"regexp": "^([^\\s].*)\\((\\d+|\\,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$",
"file": 1,
"location": 2,
"severity": 3,
"code": 4,
"message": 5
},
"background": {
"activeOnStart": true,
"beginsPattern": "^.*env-management-ui@0.0.0 dev.*",
"endsPattern": "^.*VITE v4.4.7 ready in.*",
},
},
},
{
"label": "terminate dev server",
"command": "echo ${input:terminate}", // the 'terminate' command that's defined in the inputs list
"type": "shell",
"problemMatcher": []
}
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "npm dev" // the name of the task to be terminated when the 'terminate' command is executed.
}
]
}
запуск.json —
{
"configurations": [
{
"type": "msedge",
"request": "launch",
"name": "Launch Edge against localhost",
"url": "http://localhost:5173",
"webRoot": "${workspaceFolder}",
"skipFiles": [
"${workspaceFolder}/node_modules/**/*.js"
],
"preLaunchTask": "npm dev",
"postDebugTask": "terminate dev server",
},
],
}
Объяснение:
В Tasks.json я определил следующую задачу:
{
"label": "terminate dev server",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
}
Задача получает входные данные, которые определены вinputs
список:
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "npm dev"
}
]
The terminate
входные данныеcommand
получает имя задачи, которую необходимо завершить, какargs
; в моем случае это имя , которое являетсяlabel
первого задания в моемtasks
список. Чтобы просмотреть все текущие задачи, нажмитеCTRL
+SHIT
+P
в VS Code, затем найдитеTasks: Terminate Task
. Нажав на нее, вы увидите раскрывающийся список со всеми запущенными в данный момент задачами.
В launch.json я определилnpm dev
задача как моя, так иterminate dev server
задача как моя. Поэтому, когда я ударилF5
, выполняется, запускается сервер разработки и открывается браузер с подключенным отладчиком. Затем, когда я останавливаю отладчик,postDebugTask
выполняется, прекращая мойpreLaunchTask
.