node.js - Efter att ha ändrat TypeScriptOutDir träffas aldrig brytpunkterna
Jag använder Visual Studio Professional 2013 Update 3 och jag har skapat en Node-konsolapplikation med "hello world"-loggkommandot. Om jag sätter en brytpunkt på detta kommando och sedan kör debuggern, fungerar det helt felfritt. Den träffar brytpunkten och sedan kan jag felsöka som förväntat (bara för att klargöra att mina .map-filer är skapade och fungerar korrekt).
Nu rensar jag projektet (tar bort de genererade filerna app.js och app.js.map). Jag redigerar .njsproj-filen och lägger till:
<TypeScriptOutDir>lib</TypeScriptOutDir>
Jag öppnar projektet igen, uppdaterar startfilens sökväg genom att lägga till den extra "\lib"-mappen och jag startar felsökningen. Den kör koden men träffar inte brytpunkten.
Varför träffar det inte brytpunkten? Hur fungerar Visual Studios träffdetektion för TypeScript (Node.js) projekt eftersom inga .pdb-filer har skapats vid kompileringen? Och hur kan jag fixa det så att jag kan felsöka en kompilerad kod som inte finns i samma mapp som mina källfiler?
Alla förslag, idéer eller feedback uppskattas verkligen. Tack.
Notera:
Genom att kontrollera .js.map-filen som genererats i "\lib" kan jag se hur .ts-filreferensen har en extra "..\". Så referensen är korrekt. Hur som helst verkar problemet vara att upptäcka träffen i .js-filen snarare än att mappa .js till .ts-rader.
Uppdatering:
Steg för att reproducera:
- Skapa ett nytt projekt "Blank Node.js Console Application".
- Ladda ur projektet.
- Redigera .njsproj XML och lägg till denna rad:
<TypeScriptOutDir>lib</TypeScriptOutDir> - Ladda om projektet.
- Uppdatera startfilen i projektet genom att lägga till "\lib" till sökvägen.
- Öppna filen "app.ts".
- Sätt brytpunkten i den unika koden raden "1. console.log('Hello world')"
- Starta felsökning.
Resultat: app.js genereras i mappen "\lib", VS kör filen med node, den skriver ut "Hello world" och avslutas. Ingen brytpunkt träffas.
Är det möjligt att sätta brytpunkter över en .ts-fil alltid antar att den genererade .js-filen kommer att vara i samma mapp som .ts-filen?
Jag har testat att sätta och till "lib" utan någon framgång med att brytpunkten i .ts-filen träffas.
Notera:
Om jag sätter brytpunkten direkt över filen som genereras i "\lib\app.js" så träffas den och Visual Studio börjar felsöka, men jag behöver fortfarande att det fungerar när jag sätter brytpunkterna i .ts-filerna.
Uppdatering2
Med det felsöknings-arbetande projektet (utan TypeScriptOutDir-raden i .njsproj) har jag manuellt ändrat .js.map-filen där det står:
"sources":["app.ts"] to "sources":["app.ts"]
Jag har ändrat det till app2.ts:
"sources":["app.ts"] to "sources":["app2.ts"]
app2.ts är en icke existerande fil. När vi kör projektet nu träffas inte brytpunkten. Jag har också försökt med en absolut sökväg:
"sources":["W:/VS2013/projects/NodejsConsoleAppHit/app.ts"]
och det fungerar också, men igen, om man pekar på en fil som inte finns fungerar det inte:
"sources":["W:/VS2013/projects/NodejsConsoleAppHit/app2.ts"]
Det ser ut som om filen app.js.map är ansvarig för att mappa de brytpunkter vi satte i .ts-filen till raderna i .js-filen.
Så, vad är fel på filen app.js.map som genererats i lib-mappen? Om vi tittar på denna fil kan vi se en referens till .ts-filen i den föregående mappen:
sources":["../app.ts"]
Detta borde vara okej eftersom sökvägen från "/lib/app.js" till "app.ts" är "../app.ts". Men resultatet när vi kör projektet är att brytpunkten inte träffas.
Varför? Jag har ingen aning och det är det jag behöver ta reda på.
Jag har också försökt att manuellt ändra dessa referenser mellan relativa och absoluta utan någon framgång...
Jag har skapat två "Node.js-konsolapplikations"-projekt och satt en brytpunkt i "hello world"-logginstruktionen.
NodejsConsoleAppHit är den UTAN TypeScriptOutDir-konfigurationen. Det är den som genererar filerna i projektets rotmapp och träffar brytpunkten.
https://www.dropbox.com/s/mniuhm8mgnly3ff/NodejsConsoleAppHit.zip?dl=0
NodejsConsoleAppNoHit är den MED TypeScriptOutDir-konfigurationen. Det är den som genererar filerna i lib-mappen och inte träffar brytpunkten.
https://www.dropbox.com/s/dyadwxupltcg6gc/NodejsConsoleAppNoHit.zip?dl=0
Svar #1
Enligt detta arbetsobjekt om Node.js-verktygen för Visual Studio på CodePlex: https://nodejstools.codeplex.com/workitem/1428
Problemet har tagits i beaktande och åtgärdats. Jag har testat det själv med "NTVS 1.0 RC VS 2013" och det verkar fungera bra.
Du kan få den genom att välja "NTVS 1.0 RC VS 2013" från NTVS-nedladdningssidan: https://nodejstools.codeplex.com/releases/view/149714
eller gå direkt hit: https://nodejstools.codeplex.com/downloads/get/946895
Jag måste säga att vi har använt node-inspector (https://github.com/node-inspector/node-inspector) för felsökning under tiden och det är ett verktyg som fungerar ganska bra och löste alla våra problem.
Personligen tycker jag fortfarande att VS-integrationen är mer bekväm för oss. Detta är en fråga om smak eftersom båda verkar fungera bra efter denna uppdatering av node.js-verktygen.