Включить файлы pdb в мои файлы nuget (nupkg)

Я использую MSBuild для создания своих пакетов nuget.

Есть ли какая-либо команда, которую мне нужно установить, чтобы она могла включать мои .pdb файлы, для входа в исходный код при отладке?

Я не хочу, чтобы исходные файлы были включены в проект, который загружается в пакет nuget.

9 ответов

Решение

Хотя это может не помочь при отладке, определенно полезно включить файлы.pdb, чтобы трассировки стека имели номера строк.

В файле nuspec включите <files> элемент (потомок <package>, родной брат <metadata>). Это то, что у меня есть в одной из моих библиотек классов:

<files>
    <file src="bin\$configuration$\$id$.pdb" target="lib\net452\" />
</files>

Убедитесь, что цель - это та же папка, в которой находится ваш DLL-файл.

Если вы используете VS2017 15.4 или новее, вы можете определить свойство MSBuild в вашем файле проекта

<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>

Это обсуждается в NuGet #4142

С новым форматом csproj создание NuGet можно сделать проще с MSBuild. Для того, чтобы включить ваш pdb файлы, которые вы просто должны ввести тег <IncludeSymbols>true</IncludeSymbols> в группе свойств. Это создаст дополнительный .symbols.nupkg пакет, который вы можете выпустить в свой канал.

Это также можно сделать с помощью интерфейса командной строки dotnet.

Путем упаковки с

dotnet pack --include-symbols --include-source [path-to-project-here]

Я получаю полную отладку сгенерированных мной пакетов

В 2023 году правильный способ сделать это — использовать SymbolLink.

Включите следующий пакет NuGet, и он установит все необходимые свойства. https://github.com/dotnet/reproducible-builds

Я использовал его в своей DLL, и люди могут его отладить. https://github.com/xavierjohn/FunctionalDDD

Подход, который сработал для меня, заключался в добавлении PDB в качестве контента, который имел преимущество, он будет скопирован вместе с DLL. (Требуется PackageCopyToOutput)

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <EmbedAllSources>true</EmbedAllSources>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="bin\$(Configuration)\$(AssemblyName).pdb" PackagePath="contentFiles\any\netstandard2.0\$(AssemblyName).pdb">
       <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>
  </ItemGroup>
</Project>

EmbedAllSources - будет включать исходный код в PDB для упрощения отладки.

Вы также можете рассмотреть возможность установки для параметра "Оптимизировать" значения false для улучшения процесса отладки в конфигурации выпуска.

Более новый подход заключается в использовании следующих свойств .csproj:

      <DebugType>embedded</DebugType>
<EmbedAllSources>true</EmbedAllSources>

EmbedAllSources — будет включать исходный код в PDB для упрощения отладки.

Установка для DebugType значения «встроенный» приведет к внедрению PDB в .DLL.

Таким образом, используя оба варианта вместе, исходный код будет встроен в DLL.

Обратитесь к этой ссылке. На самом деле вы должны добавить -Symbols в конец команды, чтобы создать пакет символов. Вы не должны добавлять файлы pdb в основной пакет nuget.

Включить Symbol и Source Server

Когда установлено, ProGet будет сканировать пакеты NuGet для .pdb файлы и сделать их доступными в качестве сервера символов по URL-адресу /symbols/[FeedName]. См. Раздел "Сервер символов" для получения дополнительной информации.

От: inedo.com

Другие вопросы по тегам