web-dev-qa-db-ja.com

vscodeがpreLaunchTaskの完了を待たないようにする方法は?

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が待機するのをどのように回避できますか?

更新

その間、私は vscodeタスクページ を読み、このタスク構成を思いつきました。それでもうまくいきません

{
    "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のようなターミナルアプリ)に関係していますか?

29
Mike Lischke

これでうまくいきました。

重要ではありませんが、これらはすべて必須です。

  • 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": ".",
          }
        }
      ]
    }
  ]
}
7
mike wyatt

背景/タスクの監視

一部のツールは、ファイルシステムの変更を監視しながらバックグラウンドで実行し、ファイルがディスク上で変更されたときにアクションをトリガーすることをサポートしています。 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.がコンソールに出力されると、コンパイラーは停止します。
  • これら2つの文字列の間に問題が報告されます。
  • コンパイラーは、最初の起動時にも実行されます(File change detected. Starting incremental compilation...をコンソールに出力せずに)。

この情報を取得するために、問題マッチャーはbackgroundプロパティを提供できます。

tscコンパイラの場合、適切なbackgroundプロパティは次のようになります。

"background": {
    "activeOnStart": true,
    "beginsPattern": "^\\s*\\d{1,2}:\\d{1,2}:\\d{1,2}(?: AM| PM)? - File change detected\\. Starting incremental compilation\\.\\.\\.",
    "endsPattern": "^\\s*\\d{1,2}:\\d{1,2}:\\d{1,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*\\d{1,2}:\\d{1,2}:\\d{1,2}(?: AM| PM)? - File change detected\\. Starting incremental compilation\\.\\.\\.",
                    "endsPattern": "^\\s*\\d{1,2}:\\d{1,2}:\\d{1,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 &",
6
Tarun Lalwani

追加してそれをバックグラウンドジョブにしようとするとどうでしょうか:"isBackground": true

0
李骏骁