2013-04-08 12 views
16

Mam rozwiązanie, nad którym pracuję, zawierające 4 projekty bibliotek klasowych (A, B, C, D). A i B można uznać za projekty najwyższego poziomu w rozwiązaniu. Zarówno A, jak i B odniesienie C i są samodzielne.Tworzenie jednego pakietu NuGet z wielu projektów w jednym rozwiązaniu

Te cztery projekty reprezentują grupę usług, które wykonałem obsługując zautomatyzowany przepływ pracy. Wszystkie są ściśle ze sobą powiązane i będą używane tylko w jednej lokalizacji (menadżer usług), więc nie chcę dzielić ich na różne rozwiązania.

Mój problem polega na tym, że chcę utworzyć pojedynczy pakiet NuGet, który będzie zawierał wszystkie 4 biblioteki, bez konieczności budowania ich wszystkich i zbierania ich bibliotek DLL ręcznie. Wiem, że technicznie mogłem to osiągnąć, mając albo odniesienie A lub B do pozostałych projektów, ale to nie jest prawdziwa relacja i uważam, że należy tego unikać.

Zrobiłem dużo wyszukiwania na ten problem i nie mogę znaleźć rozwiązania innego niż ręczne zbieranie bibliotek DLL i budowanie pakietu samodzielnie. Czy istnieje sposób na osiągnięcie rezultatu, który chcę wykorzystać funkcje/umiejętności NuGeta?

UWAGA: Jeśli znaczniki nie wyjaśniają, używam VS2010 z serwerem budującym TeamCity. W przypadku, gdy jest to istotne, używam Gita również przez serwer Stash.

EDYTOWANIE: Właśnie zdałem sobie sprawę, że to może być wystarczająco ważne, aby o tym wspomnieć. Projekty te odnoszą się do innych pakietów NuGet, które będę musiał oznaczyć jako zależności.

+0

Czy używasz TeamCity Nuget Pakiet budować kroki? –

+0

@DavinTryon - Nie mam jeszcze projektu skonfigurowanego w TeamCity z powodu tego problemu. Wersja na żywo tego rozwiązania jest w rzeczywistości jednym projektem i jest teraz na SVN/CC.NET. – Logarr

Odpowiedz

11

Musisz zdefiniować własny manifest Nuspec. Można wymienić zawierające zespoły w files sekcji:

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

Aby uzyskać więcej informacji przeczytaj NuSpec reference.

Następnie należy odwołać się do tego pliku nuspec w kroku kompilacji NuPack zamiast proj.

9

Jeśli pobrałeś NuGet.exe Możesz uruchomić: nuget pack Myproject.csproj -IncludeReferencedProjects i powinno to obejmować wszystkie Twoje projekty. Oto notatka z NuGet: Jeśli projekt odwołuje się do innych projektów, możesz dodać projekty referencyjne jako część pakietu lub jako zależności z opcją -IncludeReferencedProjects. Odbywa się to rekurencyjnie. Załóżmy na przykład, że masz projekt A.csproj, który odwołuje się do B.csproj i C.csproj, a B.csproj - do D.csproj & E.csproj, C.csproj reference F.csproj & G.csproj. Następnie, po uruchomieniu:

nuget pack A.csproj -IncludeReferencedProjects 

wygenerowany pakiet będzie zawierał pliki z projektów B, C, D, E, F, G, & oprócz plików z projektu A.

Jeśli projekt ma odwoływać odpowiedni plik Nuspec o tej samej nazwie, a następnie ten projekt odwoływania się jest dodawany jako zależność. Używając tego samego przykładu, załóżmy, że teraz jest plik C.nuspec w tym samym katalogu, co plik projektu C.csproj.Po uruchomieniu:

nuget pack A.csproj -IncludeReferencedProjects 

wygenerowany pakiet będzie zawierał pliki z projektów B, D, E, oprócz plików z projektu A, a opakowanie ma uzależnienia od C

Proszę również zobaczyć Command line reference .

+1

Naprawdę rozwiązałem ten problem poprzez przeprojektowanie mojej struktury projektu. Twoja odpowiedź ignoruje prawdziwą relację projektową, którą opisałem w moim projekcie, która nie jest drzewem takim, jak wyjaśniłeś. – Logarr

+2

@Logarr: Czy mógłbyś dodać odpowiedź opisującą sposób rozwiązania problemu? Dzięki! –

+0

@ Stécy - Spróbuję. Najpierw muszę pamiętać, do którego rozwiązania się odwołałem ... – Logarr

Powiązane problemy