从 postDebugTask - 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中停止监视进程,有没有办法通过在 tasks.json 中提供名称 (Watch Styles) 作为参数来终止任务。手表样式是一个持续运行的过程,请建议是否有任何其他方法可以在调试完成后终止任务。

这将在调试停止后终止所有任务

或者在这种情况下,只需build_runner watch...

启动.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"
}
]
}

任务.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#_command-variables

这对我有用:

{
"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名字可以是你想要的任何名称。

要调用调试后任务,您的 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 中。 这里有一些最少的信息:在任务文档中使用命令。

[我将添加另一个答案,因为新的附加信息非常广泛。

运行预启动任务然后启动调试会话似乎存在问题。 特别是第一次尝试时调试不起作用。 它似乎已在内部版本中修复,并可能在 2019 年 2 月初发布。 终端不发送在线数据。

同时,在我丢失链接的问题之一中有一个建议的修复程序,这是一个问题匹配器,它将向调试器发出相关任务已完成的信号。

在我的监视任务中,我使用了这个:

"problemMatcher": [
{
"base": "$tsc-watch",
"background": {
"activeOnStart": true,
"beginsPattern": "Using gulpfile ~\OneDrive\experimental\gulpfile.js",
"endsPattern": "Starting 'watch'..."
}
}
],

我之所以选择它,是因为当我手动启动gulp:watch任务时,我在终端中得到这个:

[22:27:48] Using gulpfile ~OneDriveexperimentalgulpfile.js
[22:27:48] Starting 'watch'...
[22:27:48] Starting 'watch'...

所以你在那里看到了我复制的开始和结束模式(带有额外的转义)。

我建议您单独运行"预调试任务",并将开始和结束输出复制到"预调试任务"problemMatcher中,看看它现在是否有效。

我相信我在第一个答案中的代码是正确的,我只是没有像你一样使用"isBackground"和"dependsOn"。 但是我已经在我的和problemMatcher选项中添加了"isBackground",它现在可以完美运行。

希望这将在下一个 2019 年 2 月版本中修复,并且不需要此解决方法。

如果在Linux或macOS上,一个不太笨拙的解决方案是使用pkill。如果在 Windows 上,请参阅下文。

首先运行任务并找到针对该任务运行的完整命令 vscode$ ps -af

然后在postDebugTask中使用pkill+ 完整命令。

我在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任务的方式。

presentation属性可防止此任务在成功完成后占据焦点或占用终端空间。

然后,在launch.json配置中引用该任务:

{
...
"preLaunchTask": "npm:watch",
"postDebugTask": "stop npm:watch",
...
}

如果 full 命令包含不断变化的参数(路径、端口号等),则可以使用命令的一部分或正则表达式。

例如:我本可以匹配'./scripts/watch.js''node.*watch'


对于Windows:您可以通过用pkill代替taskkill来完成这项工作。

如果你想同时支持 Unix 和 Windows,你可以制作一个脚本,根据底层操作系统执行其中一种操作。

这就是我的 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中,我取消了以下任务terminate dev server

{
"label": "terminate dev server",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
}

任务接收terminate输入,该输入在inputs列表中定义:

"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "npm dev"
}
]

terminate输入的command获取要终止的任务的名称args;在我的例子中,名称是npm dev,这是我tasks列表中第一个任务的label。若要查看当前正在运行的所有任务,请在 VS Code 中按CTRL+SHIT+P,然后搜索"Tasks: Terminate Task"。单击它将显示一个下拉列表,其中包含所有当前正在运行的任务。

launch.json中,我将npm dev任务定义为我的preLaunchTaskterminate dev server任务定义为我的postDebugTask。因此,当我点击F5时,preLaunchTask被执行,运行开发服务器并打开带有调试器的浏览器。然后,当我停止调试器时,postDebugTask被执行,终止我的preLaunchTask

相关内容

  • 没有找到相关文章

最新更新