Завершить другую задачу из поста 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.

Другие вопросы по тегам