2013-04-08 9 views
16

Ich habe eine Lösung, an der ich arbeite, die 4 Klassenbibliotheksprojekte enthält (A, B, C,). A und B können als die Top-Level-Projekte in der Lösung betrachtet werden. Sowohl A als auch B sind die Referenznummern C und alleinstehend.Erstellen eines NuGet-Pakets aus mehreren Projekten in einer Lösung

Diese vier Projekte stellen eine Gruppe von Diensten dar, die ich für einen automatisierten Workflow eingerichtet habe. Sie sind alle eng miteinander verbunden und werden nur an einem Ort verwendet (der Service-Manager), so dass ich sie nicht in verschiedene Lösungen aufteilen möchte.

Mein Problem ist, dass ich ein einzelnes NuGet-Paket erstellen möchte, das alle 4 Bibliotheken enthält, ohne sie alle erstellen und ihre DLLs manuell sammeln zu müssen. Ich weiß, dass ich dies technisch erreichen könnte, indem ich entweder A oder B die restlichen Projekte referenziere, aber das ist keine echte Beziehung und ich denke, dass es vermieden werden sollte.

Ich habe eine Menge Suche nach diesem Problem gemacht und ich kann keine andere Lösung finden, als manuell die DLLs zu sammeln und das Paket selbst zu erstellen. Gibt es eine Möglichkeit, das gewünschte Ergebnis mit den Funktionen von NuGet zu erreichen?

HINWEIS: Wenn die Tags nicht klar machen, verwende ich derzeit VS2010 mit einem TeamCity Build Server. Falls es relevant ist, verwende ich Git auch über einen Stash-Server.

EDIT: Ich habe gerade festgestellt, dass dies wichtig genug sein könnte, um zu erwähnen. Diese Projekte verweisen auf andere NuGet-Pakete, die ich als Abhängigkeiten kennzeichnen muss.

+0

Sind Sie der Teamcity NuGet Pack-Schritte bauen mit? –

+0

@DavinTryon - Ich habe das Projekt wegen dieses Problems noch nicht in TeamCity eingerichtet. Die Live-Version dieser Lösung ist eigentlich ein einzelnes Projekt und es ist gerade auf SVN/CC.NET. – Logarr

Antwort

11

Sie müssen Ihr eigenes nuspec-Manifest definieren. Sie können enthalten Baugruppen in files Abschnitt Liste:

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

Weitere Details NuSpec reference lesen.

Dann verweisen Sie diese Nuspec-Datei in NuPack Build-Schritt statt Proj.

9

Wenn Sie NuGet.exe heruntergeladen haben Sie können: nuget pack Myproject.csproj -IncludeReferencedProjects ausführen, und das sollte alle Ihre Projekte enthalten. Hier ist eine Notiz aus dem NuGet docs:

Wenn das Projekt auf andere Projekte verweist, können Sie die referenzierten Projekte als Teil des Pakets oder als Abhängigkeiten mit der Option -IncludeReferencedProjects hinzufügen. Dies geschieht rekursiv. Angenommen, Sie haben das Projekt A.csproj, das B.csproj und C.csproj referenziert, während B.csproj auf D.csproj verweist & E.csproj, C.csproj Referenzen F.csproj & G.csproj. Dann, wenn Sie laufen:

nuget pack A.csproj -IncludeReferencedProjects 

das erzeugte Paketdateien aus Projekten B enthalten, C, D, E, F & G, zusätzlich zu den Dateien von Projekt A.

Wenn ein Referenzprojekt hat eine entsprechende Nuspec-Datei mit dem gleichen Namen, dann wird das referenzierte Projekt stattdessen als Abhängigkeit hinzugefügt. Nehmen wir nun an, dass sich die Datei C.nuspec im selben Verzeichnis wie die Projektdatei C.csproj befindet.Wenn Sie laufen:

nuget pack A.csproj -IncludeReferencedProjects 

das erzeugte Paketdateien aus Projekten B enthalten, D, E, zusätzlich zu den Dateien aus Projekt A, und das Paket hat die Abhängigkeit von C.

Bitte beachten Sie auch die Command line reference .

+1

Ich habe dieses Problem durch die Neugestaltung meiner Projektstruktur gelöst. Ihre Antwort ignoriert die reale Projektbeziehung, die ich in meinem Projekt skizziert habe, die kein Baum wie Sie ist. – Logarr

+2

@Logarr: Würde es Ihnen etwas ausmachen, eine Antwort hinzuzufügen, die beschreibt, wie Sie es gelöst haben? Vielen Dank! –

+0

@ Stécy - Ich werde es versuchen. Zuerst muss ich mich daran erinnern, auf welche Lösung ich mich bezog ... – Logarr

Verwandte Themen