Завершить задачу ng serve в коде vs при остановке отладки

У меня есть проект Angular, и в настоящее время я отлаживаю код vs через отладчик для Chrome. В моем launch.json используется "preLaunchTask": "serve", где serve определена в tasks.json как "ng serve", так что сначала выполняется ng serve, а sever готов до того, как браузер откроет отладчик для нажатия http://localhost:4200.

Все нормально работает. Однако, когда я прекращаю отладку, у меня все еще "ng serve" задача выполняется должным образом, и мне каждый раз приходится завершать эту задачу вручную.

Я попытался использовать "postDebugTask" в launch.json, но мне не повезло, так как код vs будет жаловаться на запуск новой задачи (postDebug) до тех пор, пока другая запущенная задача (preLaunch) не будет завершена. Может ли кто-нибудь помочь?


person Jay    schedule 11.12.2018    source источник


Ответы (2)


Посмотрев на это некоторое время, кажется, что нет никакого чистого способа убить задачу в VS Code, которая была запущена как часть preBuildTask. Это задача сборки, и сама задача отладки кажется отдельной от нее. Поскольку сам PID отладки нацелен на Chrome, между ними существует странное разделение.

Итак, давайте перебьем его.

Во-первых, нам нужно запустить наш начальный ng serve как дочерний процесс, чтобы другая задача не жаловалась на то, что первая задача загружает терминал. У меня сработала эта задача:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "serve",
            "command": "ng serve",
            "isBackground": true,
            "type": "shell",
            "presentation": {
                "reveal": "always"
            },
            "problemMatcher": {
                "fileLocation": "relative",
                "background": {
                }
            }
        }
    ]
}

Обратите внимание на свойство isBackground. Это создаст любые будущие задачи в их собственной оболочке. presentation равно reveal: always, поэтому мы можем видеть вывод CLI. Мы можем пофантазировать и зафиксировать проблемы CLI с процессом отладки в problemMatcher, но давайте пока забудем об этом.

Теперь давайте сделаем kill задачу. Вместо того, чтобы работать через VS Code, чтобы найти начальную порожденную задачу, давайте сделаем это через нашу ОС. Теперь это сильно зависит от какой ОС и какой оболочки вы используете (оболочки можно настроить для каждой задачи с помощью свойства shell).

Нам нужно найти PID оболочки ng serve и отправить его на большой компьютер в небе. Мы можем найти PID, занимающий обслуживаемый порт localhost, который, как я предполагаю, по умолчанию равен 4200.

Пример команды CMD:

for /F "tokens=1,2,3,4,5" %A in ('"netstat -a -n -o | find 4200""') DO ('"Taskill /PID %E /F"')

Пример команды bash / terminal (как обычно проще):

[sudo] lsof -ti:4200 | xargs kill

Затем просто создайте kill задачу с помощью команды и добавьте ее в postDebugTask:

    {
        "label": "kill",
        "command": "lsof -ti:4200 | xargs kill",
        "type": "shell",
    }

Если вы столкнулись с правами доступа, вы, вероятно, можете исправить это, запустив VS Code от имени администратора или указав путь к .exe, где у вас уже есть права администратора. Опять же, это зависит от вашей оболочки и ОС.

person joh04667    schedule 11.12.2018

Как указано в этот S.O. answer, в VSCode недавно была добавлена ​​возможность запускать команды рабочей среды из задач. Похоже, что лучшим решением этой проблемы является выполнение следующей задачи "postDebugTask": "end serve"

{
   "label": "end serve",
   "type": "process",
   "command":[
      "${command:workbench.action.tasks.terminate}"
   ],
},

Вам будет предложено выбрать задачу, которую вы хотите завершить, из раскрывающегося списка. К сожалению, мне не удалось найти способ сообщить VSCode, какую задачу вы хотите завершить с помощью аргумента.

Как указано в связанном ответе, если у вас есть только одна задача на выбор, вы можете автоматически выбрать эту задачу с помощью

{
   "label": "end serve",
   "type": "process",
   "command":[
      "${command:workbench.action.tasks.terminate}",
      "${command:workbench.action.acceptSelectedQuickOpenItem}",
   ],
},

Таким образом устраняется выпадающее меню.

person John    schedule 12.03.2019