Завершить работу ng serve в коде vs при остановке отладки - PullRequest
0 голосов
/ 12 декабря 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Как указано в в этом ответе SO , возможность запуска команд рабочей среды из задач была недавно добавлена ​​в 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}",
   ],
},

, что исключает раскрывающееся меню.

0 голосов
/ 12 декабря 2018

Посмотрев на это некоторое время, кажется, что нет никакого чистого способа убить задачу в 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, подключенный к локальному порту, который обслуживается, и я по умолчанию принимаю 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, где у вас уже есть права администратора.Опять же, зависит от вашей оболочки и ОС.

...