Open Acgua opened 2 years ago
Ich bin mir noch nicht mal sicher, ob das überhaupt ein "Bug" ist, oder ob beim Entwickeln mit dem dev-server das Debugging mit Breakpoints immer unterhalb <Adapter-Verzeichnis>\.dev-server\default\node_modules\iobroker.<Adapter-Name>\
stattfinden sollte, während man den Code selbst unterhalb <Adapter-Verzeichnis>\
, außerhalb von .dev-server\
, entwickelt.
Die Doku geht wohl nicht näher darauf ein: https://github.com/ioBroker/dev-server#visual-studio-code
Naja effektiv kopiert der dev-Server den Adapter genau in das genannte Verzeichnis ... und dort wird es ausgeführt ... es geht also ggf nicht anders ... odert kann man dem Adater das irgendwie "Mappen"?
@Apollon77 - das dachte ich mir dann auch, als ich das so zusammenfasste. Ausführung müsste ja dann unter <Adapter-Verzeichnis>\main.js
zum Debuggen, aber das entspricht ja nicht dem Konzept vom dev-server, oder?
Falls bestätigt, ergänze ich die Doku unter https://github.com/ioBroker/dev-server#visual-studio-code entsprechend, also dass Debugging/Breakpoints unterhalb <Adapter-Verzeichnis>\.dev-server\default\node_modules\iobroker.<Adapter-Name>\
zu erfolgen hat, und nicht <Adapter-Verzeichnis>\
, während Entwicklung weiterhin unter <Adapter-Verzeichnis>\main.js
etc. zu machen ist (und Entwicklung/Coding keinesfalls unter <Adapter-Verzeichnis>\.dev-server\
.
@Apollon77 kann man dem Adater das irgendwie "Mappen"?
Das Mappen erfolgt über die erzeugten sourcemaps. Aber genau da scheint der Wurm drin zu sein
Evtl sollten wir Mal Versionen und Einstellungen Aller Komponenten zwischen dem wo es funktioniert und wo nicht vergleichen
Ich habe das gleiche Problem unter Linux, Folgendermassen funktioniert es bei mir:
Terminal 1
dev-server run
Terminal 2
node --inspect=0.0.0.0:9229 .dev-server/default/node_modules/<Adapter-name>/ --logs --force
In VS code launch.json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "attach to ioBroker-Adapter",
"address": "127.0.0.1",
"port": 9229,
"localRoot": "${workspaceFolder}",
"remoteRoot": "${workspaceFolder}/.dev-server/default/node_modules/${workspaceFolderBasename}",
"smartStep": true,
"skipFiles": [
"<node_internals>/**"
]
}
}
Wichtig! Bei Verwendung von workspaceFolderBasename muß das Quellverzeichnis klein geschrieben werden, also nicht ioBroker.Xxx sondern iobroker.xxx
Ich habe gerade festgestellt, dass auch dev-server watch funtioniert und dann ohne Terminal 2 direkt attach der o.g. config aufzurufen
Hi, ich habe das im VSCode versucht. Ich sehe im Terminal auch, dass der dev-server gestartet ist und die Ports sind weitergeleitet.
Ich bekomme die Meldung Debugger listening on ws://127.0.0.1:9229/57e27cb1-024b-4002-8f26-b32de90af3ae Und dann Debugger attached.
Allerdings kann ich keinen Breakepoint setzten. Den dev-server kann ich auf meinem Desktop über die url http://localhost:8081/#tab-intro erfolgreich aufrufen. Also das sollte passen.
Ich habe das gleiche Problem unter Linux, Folgendermassen funktioniert es bei mir:
Terminal 1
dev-server run
Terminal 2node --inspect=0.0.0.0:9229 .dev-server/default/node_modules/<Adapter-name>/ --logs --force
In VS code launch.json{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "attach", "name": "attach to ioBroker-Adapter", "address": "127.0.0.1", "port": 9229, "localRoot": "${workspaceFolder}", "remoteRoot": "${workspaceFolder}/.dev-server/default/node_modules/${workspaceFolderBasename}", "smartStep": true, "skipFiles": [ "<node_internals>/**" ] } }
Wichtig! Bei Verwendung von workspaceFolderBasename muß das Quellverzeichnis klein geschrieben werden, also nicht ioBroker.Xxx sondern iobroker.xxx
Ich habe gerade festgestellt, dass auch dev-server watch funtioniert und dann ohne Terminal 2 direkt attach der o.g. config aufzurufen
dev-server debug --wait
funktioniert auch. Vorteil hierbei ist u.a. dass der Adapter mit der Initiatalisierung wartet, bis man einen Debugger attached, also z. B. einen, den man in launch.json konfiguriert hat.
Bei AlCalzone habe ich darüber hinaus noch diesen Ansatz gefunden, der bei mir funktioniert:
{
"name": "Debug TS adapter",
"port": 9229,
"request": "attach",
"skipFiles": [
"<node_internals>/**"
],
"type": "node",
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
// only exclude node_modules from the workspace folder
// If we exclude node_modules from .dev-server/..., we don't get sourcemaps
"!${workspaceFolder}/node_modules/**"
],
"sourceMapPathOverrides": {
"../src/*": "${workspaceFolder}/src/*"
}
}
Jetzt noch für interessierte folgende Erweiterung: Mit der Konfiguration (beide funktionieren, daher lege ich beide auf Halde, falls einmal mit einer davon etwas nicht funktionieren sollte)
// launch.json
{
"type": "node",
"request": "attach",
"name": "Attach to ioBroker Adapter (1)",
"address": "127.0.0.1",
"port": 9229,
"localRoot": "${workspaceFolder}",
"remoteRoot": "${workspaceFolder}/.dev-server/default/node_modules/iobroker.gjsm/",
"smartStep": true,
"skipFiles": ["<node_internals>/**"],
"preLaunchTask": "preLaunchTask_startDevServer", // Start dev server before attaching a debugger to it
"postDebugTask": "postDebug_KillAll", // Kill all tasks after debugging
"continueOnAttach": true // This is needed to prevent the debugger from stopping on the first line
},
{
"name": "Attach to ioBroker Adapter (2)",
"port": 9229,
"request": "attach",
"skipFiles": ["<node_internals>/**"],
"type": "node",
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
// only exclude node_modules from the workspace folder
// If we exclude node_modules from .dev-server/..., we don't get sourcemaps
"!${workspaceFolder}/node_modules/**"
],
"sourceMapPathOverrides": {
"../src/*": "${workspaceFolder}/src/*"
},
"preLaunchTask": "preLaunchTask_startDevServer", // Start dev server before attaching a debugger to it
"postDebugTask": "postDebug_KillAll", // Kill all tasks after debugging
"continueOnAttach": true // This is needed to prevent the debugger from stopping on the first line
}
// tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "devserver:debug", // <-- from package.json <-- scripts: dev-server debug --wait
"label": "preLaunchTask_startDevServer",
"isBackground": true,
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": {
"pattern": {
"regexp": "^$"
},
"background": {
"activeOnStart": true,
"beginsPattern": "devserver:debug",
"endsPattern": "Debugger is now waiting on process id"
}
}
},
{
"label": "postDebug_KillChoice",
"type": "process",
"command": [
"${command:workbench.action.tasks.terminate}",
"${command:workbench.action.acceptSelectedQuickOpenItem}"
]
},
{
"label": "postDebug_KillAll",
"command": "echo ${input:terminate}",
"type": "shell",
"problemMatcher": []
}
],
"inputs": [
{
"id": "terminate",
"type": "command",
"command": "workbench.action.tasks.terminate",
"args": "terminateAll"
}
]
}
Siehe Forum-Beitrag von OliverIO: https://forum.iobroker.net/post/826766 Bei mir verhält sich das auch so, daher öffne ich jetzt mal dieses Issue.
Issue
VS Code erkennt die Breakpoints nur in
<Adapter-Verzeichnis>\.dev-server\default\node_modules\iobroker.<Adapter-Name>\main.js
und nicht in<Adapter-Verzeichnis>\main.js
Aufgrund
"stopOnEntry": true
in derlaunch.json
hält bei "F5" das Debugging hier:main.js-Pfad:
C:\iobroker\DEV1\node_modules\ioBroker.mytest03-js\.dev-server\default\node_modules\iobroker.mytest03-js\main.js
Breakpoints werden ebenso erkannt:
Die
C:\iobroker\DEV1\node_modules\ioBroker.mytest03-js\main.js
wird aber ignoriert und Breakpoint wie hier auf Zeile 39 gesetzt nicht erkannt.Diagnose Breakpoint Problems in VS Code, also Ctrl+Shift+P > "Debug: Diagnose Breakpoint Problems", zeigt:
Diagnose Breakpoint Problems, "What scripts and sourcemaps are loaded" listet außerdem ausschließlich Dateien unterhalb von
C:\iobroker\DEV1\node_modules\ioBroker.mytest03-js\.dev-server\default\
Verwendetes System und Setup
System:
c:\ioBroker\DEV1\
Vorgehensweise:
In der Konsole:
iob stop
ausführen, und nach Ausführung Konsole schließen.cd C:\iobroker\DEV1\node_modules
ausführen.npx @iobroker/create-adapter
ausführen, "typische" Einstellungen, Sprache: JavaScript, Name:mytest03-js
(d.h. Adapter-Pfad =C:\iobroker\DEV1\node_modules\ioBroker.mytest03-js
). Option "dev-server" aktiviert.C:\iobroker\DEV1\node_modules\ioBroker.mytest03-js
wählen.cd C:\iobroker\DEV1\node_modules\ioBroker.mytest03-js
ausführen).dev-server watch --noStart
ausführen.launch.json
den bestehenden Code mit Folgendem überschreiben: