1

Ich arbeite gerade an einer .NET Core-Bibliothek, die ich als NuGet-Paket in einem anderen Projekt verwenden werde.Automatisieren des Nuget-Pakets Push mit .NetCore RC2

Ich konnte das Projekt erfolgreich mit dem Befehl "dotnet pack" im Projektverzeichnis verpacken und dieses Paket nach MyGet hochladen.

Ich würde diesen Vorgang des Pushings des NuGet-Pakets mit dem Befehl "nugget push" lieber automatisieren.

Mein Problem ist, dass die Eigenschaft "scripts", die in der Datei project.json definiert ist, nicht auf Pack oder Build ausgeführt wird. Ich habe erwartet, dass diese Skripte ausgeführt werden, wenn das entsprechende Ereignis eintritt, aber sie scheinen keine Wirkung zu haben, da ich beim Erstellen keine Ausgabe an die Konsole sehe, mit oder ohne das ausführliche Tag.

Ich verstehe, dass MyGet einen Paket-Feed basierend auf einem Git-Repository aktualisieren kann, aber ich würde gerne verstehen, wenn es ein Problem mit der Ausführung eines Skripts gibt, das derzeit eine project.json verwendet. Im Idealfall möchte ich den Befehl nugget push verwenden, nachdem das Paket erfolgreich ausgeführt wurde.

Hier ist meine project.json Datei:

{ 
    "version": "0.0.1", 
    "scripts": { 
    "postbuild": [ "echo build" ], 
    "prebuild": "echo build", 
    "postpack": "echo build", 
    "postpublish": "echo build", 
    "postrestore": "echo build", 
    "prepack": "echo build", 
    "prepare": "echo build", 
    "prepublish": "echo build", 
    "prerestore": "echo build" 
    }, 

    "dependencies": { 
    "NETStandard.Library": "1.5.0-rc2-24027" 
    }, 

    "frameworks": { 
    "netstandard1.5": { 
    } 
    }, 
    "buildOptions": { 
    "allowUnsafe": false, 
    "debugType": "portable", 
    "emitEntryPoint": false, 
    "xmlDoc": false 
    }, 
    "commands": { }, 
    "packOptions": { 
    "files": { 
     "include": "%project:Directory%/bin/release/*.nupkg" 
    } 
    }, 
    "configurations": { 
    "Debug": { 
     "buildOptions": { 
     "define": [ "DEBUG", "TRACE" ] 
     } 
    }, 
    "Release": { 
     "buildOptions": { 
     "define": [ ] 
     } 

    } 
    } 

} 

Antwort

5

RC2 ersetzt vorkompilierte und mit precompile und postbuild postcompile.

Sie die postcompile automatisch verwenden können, um die nupkg zu erzeugen und um das Paket zu einem nuget Server schieben

"scripts": { 
    "postcompile": [ 
    "dotnet pack --no-build", 
    "\"%project:Directory%\\..\\..\\nuget.exe\" push \"%project:Directory%\\bin\\%compile:Configuration%\\%project:Name%.%project:Version%.nupkg\" -source nugetserver -ApiKey key" 
] 
    } 

mit dieser Option wird automatisch das Dotnet Pack rufen Sie die project.json-Datei, die im Projektverzeichnis existiert . Dann wird das nugget-Paket auf den angegebenen nugget-Server verschoben.

Leider gibt es keine Variable zur Spezifizierung der Build-Konfiguration, daher müssen Sie diese im obigen Pfad manuell ändern, wenn Sie zwischen Debug- und Release-Konfiguration wechseln.

Das obige Beispiel verwendet% compile: Configuration%, um die aktuelle Build-Konfiguration anzugeben.

Die Antwort auf die aktuelle Build-Konfiguration kommt von How to run scripts based on solution configuration in ASP.NET Core RC2

Visual Studio 2017

In Visual Studio 2017 Sie die Dotnet verwenden können NuGet Befehl drücken, indem die csproj Datei bearbeiten und mit dem folgenden Befehl

<Target Name="PushPackage" AfterTargets="Pack"> 
    <Exec Command="dotnet nuget push &quot;$(MSBuildProjectDirectory)\bin\$(Configuration)\$(AssemblyName).$(Version).nupkg&quot; -s nugetserver -k apikey" /> 
</Target> 
+0

Wie können Sie dies verwenden und mehrere Frameworks umgehen? Wenn Sie mehrere Frameworks haben, wird die Postcompile nach der Kompilierung jedes Frameworks ausgeführt, also der erste wird ausgeführt, packt (alle Frameworks, aber nur das erste Framework wurde neu kompiliert) und pusht, der zweite wird ausgeführt, packt (alle Frameworks), tut dies aber nicht push, weil dieses Versionspaket bereits existiert ... – Adam

+0

Ich habe eine Reihe von Bibliotheken, die auf net461- und netstandard1.5-Frameworks abzielen, und es treibt das Paket voran. Der einzige Vorbehalt ist, dass ich zu einem lokalen geteilten Ordner drücke anstatt zu nuget, also bin ich mir sicher, was passieren würde, wenn ich drängen würde, nugget zu machen. – DazFahy

+0

Bevor Sie den nuget-Push ausführen, sollten Sie eine Skriptdatei verwenden und auf das richtige Framework testen.Die gesuchte Kontextvariable ist% compile: TargetFramework% oder% compile: FullTargetFramework% Ich habe eine vollständige Liste der Kontextvariablen hier: http://Stackoverflow.com/a/38339463/1112558 – Erikest