2016-06-07 2 views
8

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

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

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

Любые мысли?

ответ

5

Мои мысли, упаковка NuGet очень много о соглашениях.

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

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

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

Идея может быть одной версией для каждой конфигурации сборки. Both can be installed into the project. Для этого добавьте targets file to your package или постройте a powershell install script, который добавляет условные ссылки непосредственно в файл целевого проекта, если вы хотите что-то меньшее, чем то, что может сделать для вас MsBuild.

Пример первой тактики: Создать .цель файл (в вашем пакете, создать папку 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).Contains etc или просто поместить это в пакет readme

3

Вдохновленный @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> 

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

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

+1

Этот ответ должен быть обеспокоен. Благодарю. –

Смежные вопросы