web-dev-qa-db-de.com

Automatisierung der Erstellung des NuGet-Pakets im Rahmen des Build-Prozesses

Ich habe einen automatisierten Build-Prozess, den ich gerne erweitern möchte, damit ich die Bibliotheken erstellen kann, die ich über NuGet verteile. Das Ausführen von nuget.exe zum Erstellen der Pakete ist derzeit ein manueller Vorgang.

Wie kann ich VS 2010 am besten so einrichten, dass meine NuGet-Paketdatei (* .nupkg) das Endergebnis eines Builds "Release" ist?

Beachten Sie, dass ich für einige Pakete andere Dateien (Inhalt und Tools) habe. In den meisten Fällen habe ich mehrere Projekte in einem einzigen NuGet-Paket zusammengeführt, um .NET 4, Silveright und Phone 7 zu unterstützen.

(Ich sollte klarstellen, dass der vorhandene "automatisierte" Prozess ein einfacher Batch-File-Runner ist, der eine Lösung mithilfe der Befehlszeile erstellt.)

UPDATE

Ich möchte diese Diskussion auffrischen, da das Problem nicht gelöst wurde. Obwohl der bereitgestellte Link @pravin hilfreich ist, spricht er nicht die Tatsache an, dass ich mehrere Projekte in einem einzigen Paket habe, sowie andere Inhalte wie PowerShell-Skripts, Konfigurations- und Quelltextumwandlungen usw.

Das beste Beispiel, das ich verwenden kann, ist eine Assembly, die sowohl eine .NET 4- als auch eine Silverlight 5-Version hat. Diese werden in demselben Paket verteilt. Ich kann kein Post-Build-Ereignis zum Erstellen des Pakets verwenden, da das Paket von ZWEI Projekten abhängig ist.

63
SonOfPirate

Eine Sache, die möglicherweise gut funktioniert, ist das Erstellen einer benutzerdefinierten MSBuild .proj-Datei. Sie können im benutzerdefinierten Skript ein paar Ziele definieren, die zuerst das Kompilieren in Ihrer Lösung ausführen. Ein zweites Ziel, das nach der Kompilierung ausgeführt werden soll, würde die EXEC MSBuild-Task verwenden, um das Befehlszeilenprogramm nuget.exe aufzurufen. Anschließend aktualisieren Sie Ihren Batch-File-Runner, um die ausführbare Datei msbuild auszuführen, die Ihre benutzerdefinierte Projektdatei als Argument liefert. Möglicherweise verwenden Sie MSBuild bereits in Ihrem Batch-Skript. In diesem Fall handelt es sich lediglich um einen Argumentwechsel. Sie könnten Ihre benutzerdefinierte Projektdatei in die Lösungselemente Ihrer Lösung einschließen. Wenn Sie dies getan haben, können Sie problemlos eine externe Toolreferenz in Visual Studio hinzufügen, um schnell Ihr benutzerdefiniertes Skript zu testen, um sicherzustellen, dass es das Paket wie gewünscht erstellt und produziert.

MSBuild-Beispiel

Sie können dies als Startpunkt verwenden:

<Project DefaultTargets="Compile" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
      <SolutionFile></SolutionFile>
      <NugetExecutable>C:\PathToNuget\nuget.exe</NugetExecutable>
      <NuspecFile></NuspecFile>
    </PropertyGroup>

    <Target Name = "Compile">
        <MSBuild Projects="$(SolutionFile)" Properties="Configuration=Release" />
    </Target>

    <Target Name = "Package">
    <!-- You could use the MSBuild Copy task here to move the compiled code into
           a structure that fits your desired package format -->
      <Exec Command="&quot;$(NugetExecutable)&quot; pack $(NuspecFile)" />
    </Target>
</Project>

Sie würden dann so nennen:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" Build.proj /p:SolutionFile=PathToSolution\App.sln;NuspecFile=foo.nuspec
32
Josh Rack

Ich mache das, was Sie schon in meinem aktuellen Projekt erreichen wollen:

Jede Assembly ist in ein eigenes Nuget-Paket mit Abhängigkeiten integriert.

Ich habe es gelöst, indem ich im Projekt einen Paketordner erstellt habe, für den ich ein Nuget-Paket erstellen wollte. Dort konfiguriere ich eine nuspec-Datei mit den notwendigen Informationen zum nupkg

Dort mache ich alle Ordner und unveränderten Dateien, die für die Paketstruktur von Nuget benötigt werden.

Ich habe im Projekt einen Post-Build-Schritt hinzugefügt, der die gerade eingebauten Dateien in den Paketordner kopiert und nuget.exe ausführt.

So geht es:

  • Projekt erstellen 
  • Kopieren Sie die Ausgabe zurück in Package\Lib des Projekts.
  • Führen Sie nuget.exe mit der nuspec-Datei im Paketordner aus.
  • Kopieren Sie das Ergebnis in den Ausgabeordner neben dem Rest der Ausgabe.

Nuget.exe muss sich entweder in einem festen Ordner auf Ihrem System und dem Buildserver (Dirty Solution) befinden oder in Ihrem Build enthalten sein (weniger Dirty).

Buildscript:

Xcopy.exe /Y "$(TargetPath)" "$(ProjectDir)\Package\Lib" 
cd "$(ProjectDir)Package" 
"$(TargetDir)..\Buildscripts\Nuget.exe" pack MyPackage.nuspec xcopy /Y *.nupkg "$(TargetDir)" 

Um dies zu nutzen, müssen Sie nur noch entscheiden, wo die nuget.exe eingecheckt werden soll. Ich habe einen Buildscripts-Ordner auf der obersten Ebene meines Entwicklungsbaums erstellt.

10
Schwarzie2478

In einer TFS 2010-Umgebung sollte das NuGetter-Projekt das Problem der automatischen Erstellung von Nuget-Paketen lösen. Es erstellt ein Paket für den gesamten Build. Es ist tatsächlich ein TFS 2010-Erstellungsworkflow, der die Aufgabe erledigt, indem er nuget.exe mit einigen Argumenten aufruft. 

7
Alex

Ich habe eine NuGet-Projekttyp (.nuproj) Visual Studio-Erweiterung namens NuBuild erstellt, die das tun soll, was Sie möchten. Damit können Sie Ihre NuGet-Pakete sowohl aus Visual Studio als auch aus MSBuild erstellen. Sie können es von der gallery installieren oder die Quelle unter github erhalten.

7
Brent M. Spell

Installieren Sie das NuGet Powertools-Paket in Ihrem SLN und es wird ein Build-Ziel für die Erstellung des nupkg hinzugefügt. Dann müssen Sie nur Ihr CI so ändern, dass auch diese Aufgabe ausgeführt wird. http://nuget.org/packages/NuGetPowerTools

4

Ein einfacher Vorschlag, der vielleicht gut genug funktioniert ... Legen Sie ihn einfach als Postbuild-Ereignis in die .csproj-Datei:

  <PropertyGroup>
    <PostBuildEvent>$(SolutionDir)<YourPathToNugetHere>\NuGet.exe pack $(ProjectPath) -OutputDirectory ..\..\$(OutDir) -IncludeReferencedProjects -Symbols -Properties Configuration=$(Configuration)</PostBuildEvent>
  </PropertyGroup>

Dadurch wird Ihre benutzerdefinierte .nuspec-Datei (die wie die .csproj-Datei benannt werden muss) gesammelt und die .nupkg erstellt.

Das ist es.

Sie können dies sogar einfach in den Projekteinstellungen von Visual Studio tun.

1
Beachwalker

Es gibt das Nuget-Paket CreateNewNuGetPackageFromProjectAfterEachBuild das behauptet, dass es tun kann, was Sie wollen. Es gibt auch eine Dokumentation/Projektseite.

1
habakuk

Soweit ich weiß, kannst du nicht.

Führen Sie es stattdessen richtig aus und verwenden Sie eine korrekte Build-Umgebung/einen richtigen Prozess, der ein Build-Skript für Commit/Push in Ihr Haupt-Repository auslöst, das Folgendes ausführt:

  • Änderungen klonen/ziehen.
  • Lösung erstellen.
  • Baue Pakete.
  • Paket (e) zum Paketserver hochladen.

Sie können TeamCity, CruiseControl.NET oder einen anderen CI-Server auf einem VM oder auf Ihrem vorhandenen Build-Server ausführen.

0
Neil Barnwell

Installieren Sie das Nuget-Paket 'NuGet.for.MSBuild'. Es ist keine '.nuspec'-Datei erforderlich, und die erforderlichen Informationen werden der AssemblyInfo.cs entnommen. 

Setzen Sie den Build auf 'Release'. Nach der Erstellung befindet sich die nupkg-Datei im Ordner 'bin/Release'. 

https://nuget4msbuild.codeplex.com/

0
CountZero