我有一个Angular项目,目前正在通过Chrome调试器在vs代码中进行调试。我的launch.json
使用"preLaunchTask": "serve"
,其中tasks.json
中的serve被定义为"ng serve"
,这样我就首先执行了“ ng serve”,并且在调试器打开浏览器以击中服务器之前就已经准备好服务器http://localhost:4200。
一切正常。但是,当我停止调试时,仍然有"ng serve"
任务按预期运行,并且每次都必须手动终止该任务。
我尝试在"postDebugTask"
中使用launch.json
,但是运气不好,因为vs代码会抱怨开始一个新任务(postDebug),直到另一个正在运行的任务(preLaunch)没有终止。谁能帮忙吗?
答案 0 :(得分:1)
研究了一段时间后,似乎没有任何干净的方法可以终止在preBuildTask
中启动的VS Code中的任务。这是一个构建任务,而调试任务本身似乎与此分开。由于调试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
属性。这将在其自己的shell中产生任何将来的任务。 presentation
是reveal: always
,因此我们可以看到CLI输出。我们可以通过problemMatcher
中的调试过程来了解并捕获CLI问题,但现在暂时不要忘记它。
现在,让我们做一个kill
任务。让我们通过操作系统来完成它,而不是通过VS Code查找初始的生成任务。现在,这高度依赖于您使用的操作系统和哪个shell (可以通过shell
属性为每个任务配置shell)。
我们需要找到ng serve
外壳的PID,并将其发送到空中的大型计算机。我们可以寻找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",
}
如果遇到访问权限,则可以通过以admin身份运行VS Code或通过提供已具有管理员权限的.exe路径来修复它。同样,取决于您的外壳和操作系统。