Создание пакета nuget с несколькими DLL
Скажем, у меня есть проект с этой структурой:
MyLibrary\
MyLibrary.sln
MyLibrary.Core\
MyLibrary.Core.csproj
MyLibrary.Extensions\
MyLibrary.Extensions.csproj
MyLibrary.Tests\
MyLibrary.Tests.csproj
Я хочу создать единый пакет NuGet, который содержит пакеты MyLibrary.Core.dll и MyLibrary.Extensions.dll. Я не могу понять, как заставить NuGet сделать это. Я попытался создать спецификационный файл вручную, и я попытался построить его с помощью "nuget spec MyLibrary.Core.csproj". Я попытался добавить все библиотеки DLL в папку lib/, которая, как я понимаю, является условным механизмом для добавления DLL в пакет. В каждом случае я могу получить MyLibary.Core.dll, чтобы попасть в пакет, но MyLibrary.Extensions.dll не упакован вместе с ним.
TL;DR: Какова наилучшая практика для создания пакета NuGet с несколькими проектами/сборками? Есть ли учебник, который фокусируется на этом? Учебники, которые я нашел, сосредоточены на простых демонстрациях с одним проектом.
Ответы
Ответ 1
Вы запускаете NuGet для одного проекта (или файла nuspec), но он поддерживает указатели на другие проекты с помощью элемента file
. Этот элемент использует имена ваших ссылок на проект, поэтому вы избегаете: a) находить местоположение других файлов проекта и b) копировать файлы в определенное место в качестве этапа после сборки.
Предположим, что у вас есть файл nuspec для MyLibrary.Core.csproj, и он ссылается на MyLibrary.Extensions и MyLibrary.Tests, чтобы они закончите в каталоге bin после сборки:
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
...
</metadata>
<files>
<file src="bin\Release\MyLibrary.Extensions.dll" target="lib\net40" />
<file src="bin\Release\MyLibrary.Tests.dll" target="lib\net40" />
</files>
</package>
С помощью этой настройки все ваши ссылки должны оказаться в соответствующем месте в пакете NuGet. У вас все еще есть жестко закодированная "Release", но я бы, скорее всего, не распределял пакеты NuGet своих отладочных сборников.
Ответ 2
Создал ли пустой файл nuspec с помощью:
nuget spec
Если вы используете этот файл, а затем поместите свои DLL в папку под ним с именем lib, он упакует их.
У меня была небольшая проблема с попыткой создания файла nuspec из проекта или dll. Кроме того, если вы вручную ссылаетесь на любые файлы в файле nuspec, соглашения не используются. Это, вероятно, проблема с nuspecs, сгенерированными из DLL или проектов.
Кроме того, если вы пытаетесь запустить это из сборки script, которая выполняется в другой папке, вы можете указать nuget расположение вашей. \lib папки через командную строку -BasePath:
build\nuget.exe pack nuget\Company.Project.nuspec -BasePath nuget\
Ответ 3
Вы пробовали NuGet Package Explorer? Возможно, это самый простой способ:
http://nuget.codeplex.com/releases/view/59864
Ответ 4
Кажется, ваша проблема такая же, как и этот вопрос: Почему в упаковке нет ссылки на проект при упаковке?. Если это так, вы можете использовать опцию -includereferencedprojects (см. http://docs.nuget.org/docs/reference/command-line-reference#Pack_Command).
Ответ 5
Недавно я опубликовал решение для этого...
Мое решение позволяет автоматически создавать пакеты NuGet при создании решения, где каждый пакет может содержать несколько сборок, ссылки на внешние NuGets и NuGets, созданные во время одной и той же сборки, и даже включать исходный код для отладки.
В вашем случае все, что вам нужно сделать, это добавить новый проект библиотеки классов в ваше решение, ссылаться на проекты, которые вы хотите упаковать, а затем добавить событие post build.
Вы можете найти статью с руководство по прохождению здесь
и исходный код + двоичный файл здесь.
Ответ 6
У меня есть некоторый учебник, как я это сделал с окнами и визуальной студией:
создайте локальную папку и назовите ее такими пакетами, как: c:/packages//lib - важно создать другую папку в папке, назовите ее lib и прошлой там dll.
открыть nuget explorer - https://npe.codeplex.com/downloads/get/clickOnce/NuGetPackageExplorer.application
ui очень интуитивно просто добавить dll и экспортировать его в /lib (для учебника https://blog.zwezdin.com/2014/building-nuget-packages-with-gui-tool/ он по-русски, но см. на рисунках переместите его примерно на 3 клика)
он создаст файл nuspec
откройте GIT BASH - https://git-for-windows.github.io/ и перейдите к: cd c: = > cd packages (путь)
* возможно, на окнах вам понадобятся параметры разработчика для linux файлов Windows (https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/)
в GIT BASH введите команду: nuget add -source [options]
где:: полное имя nuspec (include.nuspec)
и: путь к папке lib в папке (c:/packages//lib)
после успешного завершения действия
в GIT BASH введите другую команду:
пакет nuget.nuspec
В этой папке нет файла .nupkg.
Как установить пакет Nuget.nupkg локально? - учебник, как добавить его в визуальную студию.
Ответ 7
У меня была такая же проблема, и я решил создать Nuget, который позволит создавать другие nuget из выбранного проекта.
Пакет размещен на сайте Nuget.org. После ссылки на него в проекте Вам необходимо добавить файл nuspeck в проекты, которые должны генерировать проекты.
Проект с требуемым файлом nuspeck
Последнее, что вы должны сделать, это вызвать команду Create-Nuspec в диспетчере пакетов. После того, как модуль powershell возьмет все библиотеки, являющиеся результатом сборки, он также добавит необходимые зависимости и создаст nuget в выходном каталоге.
Описание об этом пакете размещено здесь.