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のようなターミナルアプリ)に関係していますか?
これでうまくいきました。
重要ではありませんが、これらはすべて必須です。
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": ".",
}
}
]
}
]
}
背景/タスクの監視
一部のツールは、ファイルシステムの変更を監視しながらバックグラウンドで実行し、ファイルがディスク上で変更されたときにアクションをトリガーすることをサポートしています。 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*\\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 &",
追加してそれをバックグラウンドジョブにしようとするとどうでしょうか:"isBackground": true