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++?
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": ".",
}
}
]
}
]
}
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:
File change detected. Starting incremental compilation...
Est imprimé sur la console.Compilation complete. Watching for file changes.
Est imprimé sur la console.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 &",
Que diriez-vous d'essayer de le faire en arrière-plan en ajoutant: "isBackground": true