(注意:我的具体用例可能看起来很复杂,但基本想法不是!)
我有一个Gulp脚本启动一个Docker容器,它本身包含并启动另一个Gulp脚本,该脚本使用Nodemon
以调试模式启动最终的Node脚本!在Docker容器内部运行的Nodemon Gulp脚本如下所示:
nodemon({
"script": `start.js`,
"nodeArgs": [`--debug=0.0.0.0:5858`, "-nolazy"],
"ext": "js",
"restartable": true
});
我希望能够在Visual Studio代码中按[F5]
,启动最终脚本并附加VSCode的调试器!
的工作:
如果我手动启动第一个Gulp脚本,在终端中启动Docker容器,则执行带有Nodemon的其他嵌入式Gulp脚本并启动最终脚本。我可以然后在VSCode中按[F5]
启动 attach
启动配置,我就可以调试了! Docker公开了端口5858
,一切运行正常。
我想要什么:
我希望能够在终端中跳过手动启动脚本。我想要一个VSCode启动配置,它可以自行完成所有操作=>在VSCode的集成终端中启动脚本,并将调试器连接到脚本本身启动的调试过程。
我试过:
带有 "request": "attach"
任务的 preLaunchTask
启动配置。该任务是启动第一个Gulp脚本。这种方法的问题是 preLaunchTask
任务永远不会结束:它启动终端中的第一个脚本(任务有一个:" "_runner": "terminal"
&#34 ;)但最终脚本正在侦听并且没有退出(它实际上正在侦听请求)......这似乎阻止了VSCode调试器启动,因为 {{1} } 任务永远不会退出。
启动第一个脚本的 preLaunchTask
启动配置。但是在这里,即使看起来它会起作用(出现橙色调试条),调试也不会真正起作用。如果我理解正确,这是因为 "request": "launch"
启动配置本身(在指定端口上)启动Node调试器,因此调试器由Nodeer启动,在Docker容器内,永远不会听取了。
换句话说:我只想点击launch
,以便在集成终端中启动脚本,无需调试器,然后VSCode会将调试器附加到生成的[F5]
调试过程,观察如何这个过程实际上已经开始了。
更新:我还在Github上建议尝试使用127.0.0.1:5858
启动配置,但它也不起作用:https://github.com/Microsoft/vscode/issues/36685
答案 0 :(得分:1)
您的第一次尝试,attach
配置preLaunchTask
是正确的。你可能只需要一次调整。默认情况下,vscode将等待任务终止,因此您需要通过添加"isBackground": true
告诉它任务将在后台运行。然后,您需要告诉它在任务的输出中要注意哪些模式,以了解任务何时完成。这一点有点烦人,因为你必须使用problemMatcher这样做,但是这个任务不应该有问题,所以你需要给它一个不匹配任何东西的正则表达式。 e.g:
"problemMatcher": {
"pattern": {
"regexp": "__________"
},
"background": {
"activeOnStart": false,
"beginsPattern": "Some pattern when the debugging process is about to start",
"endsPattern": "Ready for attach"
}
}
任务运行器正在观察程序输出以匹配endsPattern
- 当某些输出匹配时,它将知道程序已准备好供调试器附加。如果您的脚本没有产生任何输出,则应在调用nodemon
后添加一些console.log。
通常,problemMatcher用于匹配构建任务输出的问题,而正则表达式可以匹配文件名,行和错误消息。但是在这里我们只是将它用于"背景"模式,所以我们给它一个虚拟正则表达式。这是一个描述此变通方法的线程,以及如何通过移动"背景" patternMatcher中的模式: https://github.com/Microsoft/vscode/issues/6209#issuecomment-289411630
以下是有关观看任务的文档,有关详情:https://code.visualstudio.com/docs/editor/tasks#_background-watching-tasks