Создание пакета 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\

Ответ 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 в выходном каталоге.

Описание об этом пакете размещено здесь.