Как включить пошаговую отладку зависимостей nuget в приложении dotnet 8.0, работающем внутри контейнера Docker в VSCode?

Вопрос или проблема

Следуя этому руководству 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.

Оцените материал
Добавить комментарий

Капча загружается...