从 Webstorm 中的 docker 容器远程调试 koa 应用程序(Typescript)
Remote debug a koa application (Typescript) from a docker container in Webstorm
问题:我目前正在尝试使用 KoaJS、Typescript 和 Docker 设置一个新的 NodeJS 项目。安装程序按计划工作,但远程调试给我带来了一些问题 - 或者至少就我的理解而言。
如果我启动应用程序并使用 Webstorm 中的 "Attach to Node.js/Chrome" 调试设置,调试器会工作...在某种程度上。我 运行 进入断点,但同一个文件(即 kernel.ts)再次从 docker workdir(在 Webstorm 中)打开。
看起来像这样:
Fig 1: Kernel.ts with Breakpoint
Fig 2: File opened from docker workdir
此外 - 在跳过断点后 - 额外添加的断点没有效果。
设置:
Docker文件
FROM node:11.1.0-alpine
WORKDIR /share/example
COPY package.json .
RUN npm install --quiet
COPY . .
Docker撰写
version: '3'
services:
web:
container_name: example_web
build: .
command: npm run debug
volumes:
- .:/share/example
- /share/example/node_modules
ports:
- "3000:3000"
- "9229:9229"
package.json 脚本
"debug": "nodemon --inspect=0.0.0.0:9229 -e ts,tsx --exec node -r ts-node/register ./src/kernel.ts",
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"moduleResolution": "node",
"noImplicitAny": true,
"outDir": "./dist",
"sourceMap": true,
"inlineSources": true
},
"include": [
"./src/**/*"
]
}
问题:这种设置是否可行?编译打字稿并让应用程序 运行 使用编译后的 js 并使用打字稿文件中设置的断点进行调试?
我怀疑我的打字稿配置可能是罪魁祸首。关于 Webstorm 的一些事情不理解 docker 容器中的 kernel.ts 与打开的文件相同......或者 webstorm 完全理解它但我的配置只是......缺乏。
Ps: 我在没有 Typescript 的情况下尝试了相同的设置并且它工作正常(即远程调试而不是从 [=64 打开相同的文件=] workdir 但直接跳转到设置断点的文件)。因此 - 我想 - 缺少打字稿配置或者我有概念上的误解。
好的。问题解决了。
并没有真正改变那么多。我现在让 Typescipt 在启动应用程序之前编译文件(使用 JetBrains / Webstorm FileWatchers)。
并将 Json 脚本命令更改为:
"nodemon --inspect=0.0.0.0:9229 ./dist/kernel.js"
现在按预期工作。
编辑:我猜生成的 js 文件的源映射指向 "actual source" - docker 容器中的文件 - 而不是工作目录中的 "source"。在宿主机上编译ts文件,直接指向编译后的js版本即可。
问题:我目前正在尝试使用 KoaJS、Typescript 和 Docker 设置一个新的 NodeJS 项目。安装程序按计划工作,但远程调试给我带来了一些问题 - 或者至少就我的理解而言。
如果我启动应用程序并使用 Webstorm 中的 "Attach to Node.js/Chrome" 调试设置,调试器会工作...在某种程度上。我 运行 进入断点,但同一个文件(即 kernel.ts)再次从 docker workdir(在 Webstorm 中)打开。
看起来像这样:
Fig 1: Kernel.ts with Breakpoint
Fig 2: File opened from docker workdir
此外 - 在跳过断点后 - 额外添加的断点没有效果。
设置:
Docker文件
FROM node:11.1.0-alpine
WORKDIR /share/example
COPY package.json .
RUN npm install --quiet
COPY . .
Docker撰写
version: '3'
services:
web:
container_name: example_web
build: .
command: npm run debug
volumes:
- .:/share/example
- /share/example/node_modules
ports:
- "3000:3000"
- "9229:9229"
package.json 脚本
"debug": "nodemon --inspect=0.0.0.0:9229 -e ts,tsx --exec node -r ts-node/register ./src/kernel.ts",
tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"moduleResolution": "node",
"noImplicitAny": true,
"outDir": "./dist",
"sourceMap": true,
"inlineSources": true
},
"include": [
"./src/**/*"
]
}
问题:这种设置是否可行?编译打字稿并让应用程序 运行 使用编译后的 js 并使用打字稿文件中设置的断点进行调试?
我怀疑我的打字稿配置可能是罪魁祸首。关于 Webstorm 的一些事情不理解 docker 容器中的 kernel.ts 与打开的文件相同......或者 webstorm 完全理解它但我的配置只是......缺乏。
Ps: 我在没有 Typescript 的情况下尝试了相同的设置并且它工作正常(即远程调试而不是从 [=64 打开相同的文件=] workdir 但直接跳转到设置断点的文件)。因此 - 我想 - 缺少打字稿配置或者我有概念上的误解。
好的。问题解决了。
并没有真正改变那么多。我现在让 Typescipt 在启动应用程序之前编译文件(使用 JetBrains / Webstorm FileWatchers)。
并将 Json 脚本命令更改为:
"nodemon --inspect=0.0.0.0:9229 ./dist/kernel.js"
现在按预期工作。
编辑:我猜生成的 js 文件的源映射指向 "actual source" - docker 容器中的文件 - 而不是工作目录中的 "source"。在宿主机上编译ts文件,直接指向编译后的js版本即可。