web-dev-qa-db-fra.com

Comment faire pour que vscode n'attende pas la fin d'une preLaunchTask?

J'ai une configuration de débogage dans le code Visual Studio où j'exécute un binaire externe qui peut exécuter mes fichiers JS (en utilisant duktape). L'adaptateur de débogage ne prend actuellement en charge que les demandes d'attachement (pas de lancement), je dois donc exécuter le binaire avant de pouvoir déboguer les scripts JS.

Afin d'éviter d'avoir à démarrer l'application manuellement, j'ai créé une tâche et je l'ai définie dans mon fichier 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
    }]
}

La tâche est définie ainsi:

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

Le problème est maintenant que vscode attend la fin de la tâche de pré-lancement, tandis que l'application attend qu'un débogueur se connecte. Catch 22.

Comment puis-je éviter que vscode attend la fin de la tâche de pré-lancement?

Mise à jour :

Pendant ce temps, j'ai lu sur la page des tâches vscode et j'ai trouvé cette configuration de tâche. Pourtant, ça ne marche pas pour moi

{
    "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.*$"
                },
            },
        }
    ]
}

L'application lancée imprime le message d'attente, puis attend indéfiniment une connexion de débogage. Peut-être que le problème est lié à l'application (qui est un peu Node.js comme une application terminale), écrite en C++?

29
Mike Lischke

Cela a fonctionné pour moi.

Notez que tous ces éléments sont requis, même si aucun n'est important:

  • 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

Tâches d'arrière-plan/d'observation

Certains outils prennent en charge l'exécution en arrière-plan tout en surveillant les modifications du système de fichiers, puis en déclenchant une action lorsqu'un fichier change sur le disque. Avec Gulp, cette fonctionnalité est fournie par le module npm gulp-watch. Le compilateur TypeScript tsc a intégré la prise en charge de ceci via l'option de ligne --watch command.

Pour indiquer qu'une tâche d'arrière-plan est active dans VS Code et produire des résultats de problème, un correcteur de problèmes doit utiliser des informations supplémentaires pour détecter ces state changements dans la sortie. Prenons l'exemple du compilateur tsc. Lorsque le compilateur est démarré en mode surveillance, il imprime les informations supplémentaires suivantes sur la console:

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

Lorsqu'un fichier change sur le disque qui contient un problème, la sortie suivante apparaît:

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.

En regardant la sortie montre le modèle suivant:

  • Le compilateur s'exécute lorsque File change detected. Starting incremental compilation... Est imprimé sur la console.
  • Le compilateur s'arrête lorsque Compilation complete. Watching for file changes. Est imprimé sur la console.
  • Entre ces deux chaînes, des problèmes sont signalés.
  • Le compilateur s'exécute également une fois le démarrage initial (sans imprimer File change detected. Starting incremental compilation... Sur la console).

Pour capturer ces informations, un correcteur de problèmes peut fournir une propriété background.

Pour le compilateur tsc, une propriété background appropriée ressemble à ceci:

"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\\."
}

En plus de la propriété background sur le correcteur de problèmes, la tâche elle-même doit être marquée comme isBackground pour que la tâche continue de s'exécuter en arrière-plan.

Un tasks.json Entièrement fabriqué à la main pour une tâche tsc exécutée en mode montre ressemble à ceci:

{
    "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: Contenu extrait de https://code.visualstudio.com/docs/editor/tasks

Édition-1

La tâche doit être lancée en tant que démon, alors seul isBackground va aider. Vous aurez donc quelque chose comme

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

Que diriez-vous d'essayer de le faire en arrière-plan en ajoutant: "isBackground": true

0
李骏骁