如何使 vscode 不等待完成 preLaunchTask?

Posted

技术标签:

【中文标题】如何使 vscode 不等待完成 preLaunchTask?【英文标题】:How to make vscode not wait for finishing a preLaunchTask? 【发布时间】:2017-10-29 17:40:53 【问题描述】:

我在 Visual Studio 代码中有一个调试设置,我在其中运行一个可以执行我的 JS 文件的外部二进制文件(使用 duktape)。调试适配器目前只支持附加请求(不启动),所以我必须先运行二进制文件才能调试 JS 脚本。

为了避免手动启动应用程序,我为它创建了一个任务并将其设置在我的 launch.json 文件中:


    "version": "0.2.0",
    "configurations": [
        "name": "Attach MGA",
        "type": "duk",
        "preLaunchTask": "debug mga",
        "request": "attach",

        "address": "localhost",
        "port": 9091,

        "localRoot": "$workspaceRoot",

        "stopOnEntry": false,
        "debugLog": true
    ]

任务是这样定义的:


    "version": "0.1.0",
    "command": "<absolute path to>/mga",
    "isShellCommand": false,
    "showOutput": "always",
    "suppressTaskName": true,
    "tasks": [
        "taskName": "debug mga",
        "args": ["--debugger", "main.json"]
    ]

现在的问题是 vscode 等待预启动任务完成,而应用程序等待调试器附加。第 22 条。

如何避免 vscode 等待预启动任务完成?

更新

与此同时,我阅读了the vscode task page 并提出了这个任务配置。不过,它对我不起作用


    "version": "2.0.0",
    "tasks": [
        
            "label": "launch-mga",
            "type": "shell",
            "command": "<absolute path to>/mga",
            "args": [
                "config/main.json",
                "--debugger"
            ],
            "isBackground": true,
            "problemMatcher": 
                "owner": "custom",
                "pattern": 
                    "regexp": "_____"
                ,
                "background": 
                    "activeOnStart": true,
                    "beginsPattern": "^.*Waiting for debug connection.*$",
                    "endsPattern": "^.*blah.*$"
                ,
            ,
        
    ]

启动的应用程序打印等待消息,然后无休止地等待调试连接。也许问题与用 C++ 编写的应用程序(有点像 Node.js 之类的终端应用程序)有关?

【问题讨论】:

【参考方案1】:

这对我有用。

请注意,所有这些都是必需的,即使它们都不重要:

problemMatcher.pattern.regexp problemMatcher.pattern.file problemMatcher.pattern.location problemMatcher.pattern.message problemMatcher.background.activeOnStart problemMatcher.background.beginsPattern problemMatcher.background.endsPattern

  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    
      "label": "build-extras",
      "type": "shell",
      "isBackground": true,
      "command": "./script/build-extras",

      // This task is run before some debug tasks.
      // Problem is, it's a watch script, and since it never exits, VSCode
      // complains. All this is needed so VSCode just lets it run.
      "problemMatcher": [
        
          "pattern": [
            
              "regexp": ".",
              "file": 1,
              "location": 2,
              "message": 3
            
          ],
          "background": 
            "activeOnStart": true,
            "beginsPattern": ".",
            "endsPattern": ".",
          
        
      ]
    
  ]

【讨论】:

这是真的!你必须指定模式的东西,即使它并不重要。呃 这与 Angular 完美配合,虽然 chrome 启动得太早,但热模块重新加载确保页面在“ng serve”准备好时自动刷新 最近有变化吗?我觉得这正在工作,但对我来说只是一天,现在它不起作用....我在***.com/q/68446841/1877527上发布了我自己的问题,但由于你是我的基线,所以我想我会评论:-) 今天的 VSCode 更新好像又打破了这个。 又坏了,以前可以正常使用【参考方案2】:

后台/观看任务

一些工具支持在后台运行,同时观察文件系统的变化,然后在磁盘上的文件发生变化时触发操作。对于Gulp,此类功能是通过 npm 模块 gulp-watch 提供的。 TypeScript 编译器 tsc 已通过 --watch command 行选项内置了对此的支持。

为了提供后台任务在 VS Code 中处于活动状态并产生问题结果的反馈,问题匹配器必须使用附加信息来检测输出中的这些 state 更改。我们以tsc 编译器为例。当编译器以监视模式启动时,它会向控制台打印以下附加信息:

> tsc --watch
12:30:36 PM - Compilation complete. Watching for file changes.

当磁盘上的文件更改包含问题时,会出现以下输出:

12:32:35 PM - File change detected. Starting incremental compilation...
src/messages.ts(276,9): error TS2304: Cannot find name 'candidate'.
12:32:35 PM - Compilation complete. Watching for file changes.

查看输出显示以下模式:

File change detected. Starting incremental compilation... 打印到控制台时编译器运行。 当Compilation complete. Watching for file changes. 打印到控制台时,编译器停止。 报告了这两个字符串之间的问题。 编译器也会在初始启动后运行(不将File change detected. Starting incremental compilation... 打印到控制台)。

要捕获此信息,问题匹配器可以提供background 属性。

对于tsc 编译器,适当的background 属性如下所示:

"background": 
    "activeOnStart": true,
    "beginsPattern": "^\\s*\\d1,2:\\d1,2:\\d1,2(?: AM| PM)? - File change detected\\. Starting incremental compilation\\.\\.\\.",
    "endsPattern": "^\\s*\\d1,2:\\d1,2:\\d1,2(?: AM| PM)? - Compilation complete\\. Watching for file changes\\."

除了问题匹配器上的background 属性外,任务本身还必须标记为isBackground,以便任务在后台继续运行。

在监视模式下运行的 tsc 任务的完整手工制作的 tasks.json 如下所示:


    "version": "2.0.0",
    "tasks": [
        
            "label": "watch",
            "command": "tsc",
            "args": ["--watch"],
            "isBackground": true,
            "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": "^\\s*\\d1,2:\\d1,2:\\d1,2(?: AM| PM)? - File change detected\\. Starting incremental compilation\\.\\.\\.",
                    "endsPattern": "^\\s*\\d1,2:\\d1,2:\\d1,2(?: AM| PM)? - Compilation complete\\. Watching for file changes\\."
                
            
        
    ]

PS:内容取自https://code.visualstudio.com/docs/editor/tasks

Edit-1

该任务需要作为守护进程启动,然后只有isBackground 会提供帮助。所以你会有类似的东西

"isShellCommand": true,
"command": "<absolute path to>/mga --config xyz abc &",

【讨论】:

不幸的是,isBackground 没有帮助。 vscode 仍在等待预启动任务完成。 @MikeLischke,请检查编辑,看看是否有帮助 还是没有运气。更改为您在编辑中推荐的内容后,我只收到错误消息:Failed to launch external program &lt;absolut path to&gt;/mga --debugger config/main.json &amp; . spawn &lt;absolute path to&gt;/mga --debugger config/main.json &amp; ENOENT。很奇怪。 您使用的是哪个操作系统? 我在 macOS 上。但是,我需要一个适用于 Linux、Windows 和 macOS 的解决方案。

以上是关于如何使 vscode 不等待完成 preLaunchTask?的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 完成加载后如何使 UIRefreshControl 结束刷新

如何使赛普拉斯等待具有多个结果的异步搜索完成而不会导致测试失败

如何在 Vscode 中的 Typescript 中等待后调试代码?

如何使 segue 等待功能在按钮按下时完成?

MPI 中的屏障:如何实现屏障以使进程相互等待

vscode设置中文