Я пытаюсь выяснить, можно ли использовать облачный код в VSCode для удаленной отладки приложения TypeScript Node в Kubernetes?
Я регулярно использовал Cloud Code для отладки приложений JS Node в Kubernetes, но мне трудно настроить launch.json, чтобы сделать то же самое для приложения TypeScript Node. Источников для этого не существует, и на данный момент я даже не уверен, возможно ли это.
Вот файл launch.json, который я настроил. Также вы можете увидеть настройку для локальной отладки, которая отлично работает:
{
"configurations": [
{
"name": "Kubernetes: Run/Debug",
"type": "cloudcode.kubernetes",
"request": "launch",
"skaffoldConfig": "${workspaceFolder}\\skaffold.yaml",
"watch": false,
"cleanUp": false,
"portForward": true,
"imageRegistry": "zzz.common.repositories.zzz.zzz"
},
{
"type": "node",
"request": "launch",
"name": "Local Debug",
"runtimeExecutable": "node",
"runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"],
"args": ["${workspaceRoot}/lcs/src/index.ts"],
"cwd": "${workspaceRoot}/lcs",
"internalConsoleOptions": "openOnSessionStart",
"env": { "NODE_ENV": "development" },
"skipFiles": ["<node_internals>/**", "node_modules/**"]
}
]}
В моем tsconfig.json у меня есть «sourceMap»: правда. Я предполагаю, что мне нужно сопоставить мою папку dist в Kubernetes (именно там я компилирую файлы TS в файлы JS) в папку src (которая содержит исходные файлы TS). Проблема в том, что я не смог найти никакой документации для этого.
Вот мой файл докера, чтобы вы могли видеть, что я помещаю скомпилированные файлы в папку ./dist:
FROM node:19-alpine as builder
WORKDIR /app
COPY package*.json ./
COPY tsconfig.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:19-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD [ "node", "./dist/index.js" ]
Я понял. Требовалось немного больше настроек в файле launch.json. В частности, раздел отладки с sourceFileMap. Вот окончательный результат, если у кого-то еще есть проблемы с его работой:
{
"configurations": [
{
"name": "Kubernetes: Run/Debug",
"type": "cloudcode.kubernetes",
"request": "launch",
"skaffoldConfig": "${workspaceFolder}\\skaffold.yaml",
"watch": false,
"cleanUp": false,
"portForward": true,
"imageRegistry": "zzz.common.repositories.zzz.zzz",
"debug": [
{
"image": "zzz.common.repositories.zzz.zzz/zzz-lcs/k8s",
"containerName": "lcs",
"sourceFileMap": {
"${workspaceFolder}\\lcs\\dist": "/app/dist"
}
}
]
},
{
"type": "node",
"request": "launch",
"name": "Local Debug",
"runtimeExecutable": "node",
"runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"],
"args": ["${workspaceRoot}/lcs/src/index.ts"],
"cwd": "${workspaceRoot}/lcs",
"internalConsoleOptions": "openOnSessionStart",
"env": { "NODE_ENV": "development" },
"skipFiles": ["<node_internals>/**", "node_modules/**"]
}
]
}
Обратите внимание, что мои файлы расположены внутри моего локального каталога /lcs/app/src, а моя сборка поместила их в ./lcs/dist.
Когда вы нажимаете «Отладка в Kubernetes» без этого параметра, расширение должно предложить вам ввести сопоставление источника, это произошло у вас или оно начало отладку вообще без установки этого поля?
Да, он добавляет часть массива отладки с sourceFileMap. Но пути к папкам были неправильными в sourceFileMap. Он добавляет некоторые значения по умолчанию. Когда я даю правильные пути, это сработало. sourceFileMap — это атрибут, необходимый для сопоставления файлов .js с файлами .ts с использованием файлов .map.js в целевой папке.
Cloud Code и Skaffold поддерживают машинописный текст как для запуска приложения, так и для отладки. Удалось ли вам запустить его, и только отладка не работает, или он вообще не работает? В моем приложении Typescript мой package.json содержит «main»: «src/index.js», «scripts»: { «production»: «tsc-watch --noClear --onSuccess 'node src/index.js'" , } и в skaffold.yaml я синхронизирую файлы как sync: manual: # Синхронизирую все файлы TypeScript, находящиеся в папке srC# с папкой контейнера src - src: 'src/**/*.ts' место назначения: .