Создание одного пакета NuGet из нескольких проектов в одном решении

У меня есть решение, над которым я работаю, содержащий 4 проекта библиотеки классов (A, B, C, D). A и B можно считать проектами верхнего уровня в решении. И A, и B ссылка C, а D стоит отдельно.

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

Моя проблема в том, что я хочу создать единый пакет NuGet, который будет содержать все 4 библиотеки, без необходимости создавать их все и собирать свои DLL вручную. Я знаю, что я мог бы технически достичь этого, указав A или B ссылки на оставшиеся проекты, но это не настоящие отношения, и я чувствую, что этого следует избегать.

Я много искал эту проблему, и я не могу найти решение, кроме как вручную собирать библиотеки DLL и самостоятельно создавать пакет. Есть ли способ достичь результата, который я хочу использовать функции/способности NuGet?

ПРИМЕЧАНИЕ. Если теги не очищаются, я в настоящее время использую VS2010 с сервером сборки TeamCity. В случае, если это актуально, я также использую Git через сервер Stash.

EDIT. Я просто понял, что это может быть достаточно важным, чтобы упомянуть. Эти проекты ссылаются на другие пакеты NuGet, которые мне нужно будет отмечать как зависимости.

Ответы

Ответ 1

Вы должны определить свой собственный манифест nuspec. Вы можете просмотреть список сборок в разделе files:

<file src="A\bin\Release\A.dll" target="lib\net40" />
<file src="B\bin\Release\B.dll" target="lib\net40" />
...

Подробнее читайте ссылку NuSpec.

Затем укажите, что nuspec файл в NuPack строит шаг вместо proj.

Ответ 2

Если вы загрузили NuGet.exe Вы можете запустить: nuget pack Myproject.csproj -IncludeReferencedProjects, и это должно включать все ваши проекты. Здесь примечание от NuGet docs:

Если проект ссылается на другие проекты, вы можете добавить связанные проекты как часть пакета или в зависимости от опции -IncludeReferencedProjects. Это делается рекурсивно. Например, предположим, что у вас есть проект A.csproj, который ссылается на B.csproj и C.csproj, а B.csproj ссылается на D.csproj и E.csproj, C.csproj ссылается на F.csproj и G.csproj. Затем, когда вы запустите:

пакет nuget A.csproj -IncludeReferencedProjects

сгенерированный пакет будет содержать файлы из проектов B, C, D, E, F и G в дополнение к файлам из проекта A.

Если ссылочный проект имеет соответствующий файл nuspec с тем же именем, тогда этот ссылочный проект вместо этого добавляется как зависимость. Используя тот же пример, предположим, что теперь есть файл C.nuspec в том же каталоге, что и файл проекта C.csproj. При запуске:

пакет nuget A.csproj -IncludeReferencedProjects

сгенерированный пакет будет содержать файлы из проектов B, D, E, в дополнение к файлам из проекта A, а пакет имеет зависимость от C.

Также см. Ссылка в командной строке