2013-04-08 2 views
16

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

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

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

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

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

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

+0

Вы с помощью TeamCity NuGet обновления строить шаги? –

+0

@DavinTryon - У меня нет проекта, созданного в TeamCity, но из-за этой проблемы. Живая версия этого решения на самом деле является единственным проектом, и сейчас он находится на SVN/CC.NET. – Logarr

ответ

11

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

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

Для получения более подробной информации читайте NuSpec reference.

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

9

Если вы скачали 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 pack A.csproj -IncludeReferencedProjects 

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

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

nuget pack A.csproj -IncludeReferencedProjects 

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

Пожалуйста, см Command line reference ,

+1

Я действительно решил эту проблему, перепроектировав свою структуру проекта. Ваш ответ игнорирует реальные отношения проекта, которые я изложил в своем проекте, который не является деревом, как вы объяснили. – Logarr

+2

@Logarr: Не могли бы вы добавить ответ, описывающий, как вы его решили? Благодаря! –

+0

@ Stécy - Я попробую. Сначала я должен помнить, какое решение я имел в виду ... – Logarr