我有一个Angular项目,目前通过调试器为chrome调试内部vs代码。我的launch.json
使用"preLaunchTask": "serve"
,其中服务在tasks.json
中被定义为"ng serve"
,因此我首先执行“ng serve”并且在调试器打开浏览器以打开http://localhost:4200之前服务器已准备就绪。
一切正常。但是,当我停止调试时,我仍然按预期运行"ng serve"
任务,我必须每次手动终止该任务。
我试图在"postDebugTask"
中使用launch.json
但运气不好,因为vs代码会抱怨启动一个新任务(postDebug),直到另一个正在运行的任务(preLaunch)没有终止。有人可以帮忙吗?
在调查了一段时间之后,似乎没有任何干净的方法来杀死作为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
shell的PID并将其发送到天空中的大型计算机。我们可以查找占用被服务的localhost端口的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代码或提供已拥有管理员权限的.exe路径来修复它。同样,取决于您的shell和操作系统。
正如this 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}",
],
},
从而消除了下拉菜单。