Как создать пакет nuget с выпуском и debug dll с помощью nuget package explorer?

Я использую Nuget Package Explorer для создания некоторых пакетов nuget. Мне удалось сделать это, просто построив проект в режиме Release в VS и добавив в пакет как файлы dll, так и pdb.

Пока все хорошо, но когда я добавляю пакет в другой проект и пытаюсь войти в код во время отладки, он перешагнет его.

Я понимаю, что мне нужно построить и добавить dll debug и pdb в мой пакет, если я захочу войти в код во время отладки. Я не уверен, что как добавить их в пакет, который я уже создал, который уже содержит DLL версии и файл pdb, которые называются одинаковыми.

Любые мысли?

Ответ 1

Я думаю, что упаковка NuGet - это много условностей.

Нет проблем в упаковке одних и тех же пространств имен и одинаковых имен для разных платформ (как в lib/net40/mydll.dll, lib/net35/mydll.dll т.д. В одном пакете), поскольку NuGet будет фильтровать зарегистрированные зависимости по платформе.

Сборка нескольких версий для одной и той же платформы кажется нетрадиционной, это обсуждение ориентировано на создание пакета для каждой сборки. Это не значит, что вы не можете этого сделать, но сначала вы должны спросить себя, следует ли вам это делать.

Тем не менее, если ваши сборки отладки и выпуска сильно отличаются (условная компиляция и т.д.), Это может быть полезно. Но как конечные пользователи выберут Release или Debug при установке вашего пакета?

Идея может быть одна версия на конфигурацию сборки. Оба могут быть установлены в проект. Для этого либо добавьте целевой файл в свой пакет, либо создайте сценарий установки powershell (не поддерживается начиная с Nuget v3), который добавляет условные ссылки непосредственно в целевой файл проекта, если вы хотите что-то менее базовое, чем то, что MsBuild может сделать для вас.

Пример первой тактики: Создайте файл .target (в вашем пакете создайте папку build а затем создайте build\YourLib.targets со следующим содержимым):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
    <Reference Include="YourLib">
      <HintPath>..\packages\YourLib.1.0.0\lib\Debug\YourLib.dll</HintPath>
    </Reference>
  </ItemGroup>

  <ItemGroup Condition="'$(Configuration)' == 'Release'">
    <Reference Include="YourLib">
      <HintPath>..\packages\YourLib.1.0.0\lib\Release\YourLib.dll</HintPath>
    </Reference>
  </ItemGroup>
</Project>

Если вы создали папки отладки и выпуска (папка платформы не обязательна), выходные данные сборки будут эффективно меняться в зависимости от конфигурации - при условии, что у потребителей пакетов есть обычные имена конфигурации, но вы всегда можете немного расширить логику условия с помощью $ (Configuration). Содержит и т.д. или просто поместите это в пакет readme

Ответ 2

Вдохновленный @Tewr, я нашел громоздкое, но работающее решение.

Создайте nuget со следующей структурой файла:

lib\net\$(Configuration)\YourLib.1.0.0.dll    <---- put here some dummy file  named YourLib.1.0.0.dll
tools\release\YourLib.1.0.0.dll  <--- put here the release version
tools\debug\YourLib.1.0.0.dll  <--- put here the debug version
build\YourLib.targets  

Содержимое файла целей:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyReferences" BeforeTargets="Build" Condition="Exists('..\packages\YourLib.1.0.0\lib\net\%24(Configuration)')">     
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Release" />
    <Exec Command="mkdir ..\packages\YourLib.1.0.0\lib\net\Debug" />
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Release\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Release"' />
    <Exec Command='copy "..\packages\YourLib.1.0.0\tools\Debug\YourLib.1.0.0.dll" "..\packages\YourLib.1.0.0\lib\net\Debug"' />
    <Exec Command='rmdir /S /Q "..\packages\YourLib.1.0.0\lib\net\%24(Configuration)"' />
</Target>

DLL файлы в папке lib будут автоматически добавлены в качестве ссылок, создающих в файле проекта следующее:

<Reference Include="YourLib>   
    <HintPath>..\packages\YourLib.1.0.0\lib\net\$(Configuration)\YourLib.1.0.0.dll</HintPath>
    <Private>True</Private>
</Reference>

Как только вы создадите проект в первый раз, цель скопирует версию выпуска и отладки из tools\release и tools\debug в папку lib\net\release и lib\net\debug. В конце он удалит папку lib\net\$(Конфигурация)

Наслаждайтесь (или нет - мне лично не нравится решение).

Ответ 3

Благодаря @Tewr В новом NuGet формате и формате csproj SDK стиля, мы можем использовать некоторую константу, как $(MSBuildThisFileDirectory), чтобы получить текущий путь к файлу.

Код, который использует версию, увеличит сложность обслуживания. Формат cdroj в стиле sdk использует новый формат пакета, который не выводит файл пакета в папку пакета.

Мы можем добавить файл целей в папку для сборки и использовать $(MSBuildThisFileDirectory) чтобы получить путь к файлу.

<ItemGroup Condition="'$(Configuration)' == 'DEBUG'">
    <Reference Include="YourLib">
        <HintPath>$(MSBuildThisFileDirectory)..\lib\debug\YourLib.dll</HintPath>
    </Reference>
</ItemGroup>

Посмотреть файл