我终于找到了解决办法。问题当然是 VS Code 调试适配器找不到 lib 的源文件。解决该问题的关键是 lib 项目的 tsconfig.json 中的 "sourceRoot" 选项。
考虑目录 myLib 中的一个 lib 项目和目录 myProg 中的另一个项目,该项目从 myLib 导入函数。 lib 的源文件位于 myLib/src 中,转译后的 js 文件以及源映射位于 myLib/dist 中。 myLib 和 myProg 位于同一个父目录中。
现在,当我调试 myProg 时,我希望能够单步执行从 myLib 导入的函数的调用并调试其 TS 源。
关于存储在 lib 的源映射中的源文件的路径,重要的是要知道 相对路径是相对于源映射解析的。
让我们看看其中一个 lib 的源映射中的“sources”数组:
"sources":["../src/main.ts"]
由于我们正在运行 myProg,因此该路径获得 myProg/src/main.ts,但这不是 lib 的 main.ts 的路径。
现在,我们将 "sourceRoot": "../../myLib/src/" 添加到 lib 的 tsconfig.json。我们看到源图的相关部分已经变成了
"sourceRoot":"../../myLib/src/","sources":["main.ts"]
由于此路径是相对于 myProg/dist 解析的,因此它得到 myLib/src/main.ts。
现在,我们只需要告诉 VS Code 也在 myLib/dist 中查找源映射,这会导致 "outFiles" 的值如下>myProg 的 launch.json:
"outFiles": [
"${workspaceFolder}/dist/*.js",
"${workspaceFolder}/../myLib/dist/*.js"
]
就是这样。您甚至可以在 myLib 的 .ts 文件中设置断点。他们会被击中,但我观察到他们被击中的顺序错误。
在这种情况下,请在第一次调用从 myLib 的导入之前在 myProg 中的某处设置断点。
我没有进行广泛的测试,但据我观察,这似乎解决了这个问题。
如果你有和我一样的经历,也就是你按F5,程序直接运行,没有碰到任何断点,就反复按F5,直到它工作。
我使用@builtin @id:ms-vscode.js-debug 以及@id:ms-vscode.js-debug-nightly 进行了测试,每个都使用"type": "node" 和"type": "pwa-node",但这并没有改变任何东西。
如果您在启动前打开入口点文件并在其中有一个断点,似乎需要较少的启动才能工作,但我也没有对此进行广泛测试,所以它可能只是偶然发生的。