Вопрос или проблема
Следуя этому руководству https://www.youtube.com/watch?v=ds2bud0ZYTY “Отладка .NET Core в Docker с помощью VSCode от That DevOps Guy”, я использую удаленную отладку VSCode для своего приложения net8, которое работает внутри контейнера Docker. Я могу пошагово проходить код своего приложения. Проблема возникает, когда мне нужно перейти внутрь кода из зависимости nuget. Это работает для других, использующих Visual Studio Enterprise, но я на Mac и использую VSCode. Nugets включают pdb-файлы, и я вижу их в .nuget/packages/. Это работает, когда я явно копирую pdb-файлы в каталог рядом с dll-файлами внутри контейнера. Как мне заставить dotnet publish включать pdb-файлы зависимостей nuget вместе с pdb-файлами моего приложения?
Я пробовал
RUN dotnet publish /p:DebugType=Full /p:DebugSymbols=true /p:PublishSymbols=true --configuration Debug --framework net8.0 -o /app
но это не работает. Директория /app включает все dll-файлы и pdb-файлы моего приложения, но не включает pdb-файлы зависимостей nuget.
Это работает, когда я явно копирую каждый из них вот так
RUN cp /root/.nuget/packages/example.nuget.package/1.2.3/lib/net8.0/Example.Nuget.Package.pdb /app/
Я просто не могу понять, как сделать это частью сборки/публикации?
PS. Я знаю, что использование JetBrains Rider – это другой вариант, но я пытаюсь сделать это с помощью VSCode.
Ответ или решение
Чтобы включить отладку NuGet зависимостей для приложения на .NET 8.0, работающее в Docker-контейнере и настраиваемое с использованием Visual Studio Code, необходимо выполнить несколько шагов. Эти шаги помогут вам обеспечить доступ к файлам PDB (Program Database) для зависимостей NuGet при публикации вашего приложения и его запуске в окружении Docker. Мы рассмотрим процесс более детально.
1. Настройка проекта
Прежде всего, убедитесь, что ваш проект .NET настроен правильно для отладки. Вам необходимо удостовериться, что у вас установлен правильный уровень отладки и соответствующие параметры проекта. В вашем файле проекта (*.csproj
) должны быть следующие параметры:
<PropertyGroup>
<Configuration>Debug</Configuration>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
</PropertyGroup>
2. Параметры публикации
При выполнении команды dotnet publish
используйте следующие параметры:
RUN dotnet publish -c Debug -o /app /p:DebugType=Full /p:DebugSymbols=true /p:PublishSymbols=true
Однако проблема в том, что это не всегда включает PDB файлы для зависимостей NuGet. Чтобы решить эту проблему, вы можете использовать dotnet build
с дополнительными параметрами для извлечения PDB файлов.
3. Извлечение PDB файлов из NuGet
Чтобы автоматически скопировать PDB файлы зависимостей NuGet в выходную директорию, вам потребуется изменить ваш Dockerfile. Вы можете использовать следующее решение для этого:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
# Копируем csproj и восстанавливаем зависимости
COPY *.csproj ./
RUN dotnet restore
# Копируем все остальные файлы и публикуем с нужными параметрами
COPY . ./
RUN dotnet publish -c Debug -o /app /p:DebugType=full /p:DebugSymbols=true /p:PublishSymbols=true
# Скрипт для копирования PDB файлов для зависимостей NuGet
RUN find /app -type f -name '*.dll' | while read dll; do cp "$(dirname $dll)/*.pdb" /app/; done
4. Конфигурация Docker и VSCode
Также вам нужно убедиться, что вы правильно настроили отладочную среду в VSCode. Ваш файл launch.json
должен содержать настройки для подключения к контейнеру. Убедитесь, что он выглядит следующим образом:
{
"version": "0.2.0",
"configurations": [
{
"name": "Docker .NET Core Launch (web)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "/app/YourApp.dll",
"args": [],
"cwd": "/app",
"stopAtEntry": false,
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/app": "${workspaceFolder}"
}
}
]
}
5. Запуск и отладка
После настройки Dockerfile и файла конфигурации запуска вы сможете запустить ваш контейнер и инициировать отладку через VSCode. При получении доступа к зависимости NuGet вы сможете шагать в их код, благодаря файлам PDB, которые вы настроили для копирования в выходной директории.
Заключение
Отладка NuGet зависимостей в приложении .NET 8.0, работающем в Docker, не является тривиальной задачей, но правильная настройка вашего окружения и конфигураций может значительно упростить этот процесс. Ваша цель — убедиться, что все необходимые PDB файлы находятся в выходной директории, и что VSCode правильно настроен для подключения к вашему приложению. Следуя этим шагам, вы сможете легко отлаживать как ваше приложение, так и его зависимости, оставаясь в рамках VSCode.