NuGet Packen und Wiederherstellen als MSBuild Ziele

NuGet 4.0+

Mit dem PackageReference-FormatNuGet kann 4.0+ alle Manifestmetadaten direkt in einer Projektdatei speichern, anstatt eine separate .nuspec Datei zu verwenden.

Mit MSBuild 15.1+ NuGet ist es auch ein erstklassiger MSBuild Bürger mit den packrestore unten beschriebenen Zielen. Diese Ziele ermöglichen Es Ihnen, mit jedem anderen MSBuild Vorgang oder Ziel zu NuGet arbeiten. Anweisungen zum Erstellen eines Pakets mithilfe von Paketen finden Sie unter Erstellen eines NuGet Pakets mithilfe MSBuildMSBuildvon .NuGet (Für NuGet 3.x und früher verwenden Sie stattdessen die Pack- und Wiederherstellungsbefehle über die NuGet CLI.)

Buildreihenfolge für Ziele

Da pack sie restore ziele sind MSBuild , können Sie darauf zugreifen, um Ihren Workflow zu verbessern. Angenommen, Sie möchten Ihr Paket nach dem Packen in eine Netzwerkfreigabe kopieren. Fügen Sie hierzu Folgendes in Ihrer Projektdatei hinzu:

<Target Name="CopyPackage" AfterTargets="Pack">
  <Copy
    SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg"
    DestinationFolder="\\myshare\packageshare\"
    />
</Target>

Ebenso können Sie eine MSBuild Aufgabe schreiben, Ihr eigenes Ziel schreiben und Eigenschaften in der MSBuild Aufgabe nutzenNuGet.

Hinweis

$(OutputPath) ist relativ und erwartet, dass Sie den Befehl aus dem Projektstamm ausführen.

Pack-Ziel

Für .NET-Projekte, die das PackageReference Format verwenden, msbuild -t:pack zeichnet eingaben aus der Projektdatei, um ein NuGet Paket zu erstellen.

In der folgenden Tabelle werden die Eigenschaften beschrieben, die MSBuild einer Projektdatei innerhalb des ersten <PropertyGroup> Knotens hinzugefügt werden können. Sie können diese Änderungen problemlos in Visual Studio 2017 und höheren Versionen vornehmen, indem Sie mit der rechten Maustaste auf das Projekt klicken und {Project_name} bearbeiten im Kontextmenü auswählen. Die Tabelle wird bequem durch die entsprechende Eigenschaft in einer .nuspec Datei organisiert.

Hinweis

Ownersund Summary Eigenschaften aus .nuspec werden nicht unterstützt.MSBuild

Attribut/nuspec Wert MSBuild -Eigenschaft Standard Hinweise
Id PackageId $(AssemblyName) Extraktion von $(AssemblyName) aus MSBuild
Version PackageVersion Version Dies ist semver kompatibel, z. B 1.0.0. , 1.0.0-betaoder 1.0.0-beta-00345. Standardmäßig, Version wenn nicht festgelegt.
VersionPrefix VersionPrefix empty Festlegen PackageVersion von Überschreibungen VersionPrefix
VersionSuffix VersionSuffix empty Festlegen PackageVersion von Überschreibungen VersionSuffix
Authors Authors Name des aktuellen Benutzers Eine semikolonsgetrennte Liste von Paketautoren, die den Profilnamen auf nuget.org entsprechen. Diese werden in der NuGet Galerie auf nuget.org angezeigt und werden zum Referenzpaketen von denselben Autoren verwendet.
Owners Nicht vorhanden in nuspec
Title Title $(PackageId) Ein benutzerfreundlicher Titel des Pakets, der in der Regel in der Benutzeroberfläche wie auf nuget.org angezeigt wird und der Paket-Manager in Visual Studio.
Description Description „Paketbeschreibung“ Eine lange Beschreibung für die Assembly. Wenn PackageDescription nicht angegeben ist, wird diese Eigenschaft auch als Beschreibung des Pakets verwendet.
Copyright Copyright empty Copyright-Informationen für das Paket.
RequireLicenseAcceptance PackageRequireLicenseAcceptance false Ein Boolescher Wert, der angibt, ob der Client den Verbraucher dazu auffordern muss, die Paketlizenz vor der Installation des Pakets zu akzeptieren.
license PackageLicenseExpression empty Entspricht <license type="expression"> Siehe Packen eines Lizenzausdrucks oder einer Lizenzdatei.
license PackageLicenseFile empty Pfad zu einer Lizenzdatei innerhalb des Pakets, wenn Sie eine benutzerdefinierte Lizenz oder eine Lizenz verwenden, die nicht einem SPDX-Bezeichner zugewiesen wurde. Sie müssen die referenzierte Lizenzdatei explizit packen. Entspricht <license type="file"> Siehe Packen eines Lizenzausdrucks oder einer Lizenzdatei.
LicenseUrl PackageLicenseUrl empty PackageLicenseUrl ist veraltet. Verwenden Sie stattdessen PackageLicenseExpression oder PackageLicenseFile.
ProjectUrl PackageProjectUrl empty
Icon PackageIcon empty Ein Pfad zu einem Bild im Paket, das als Paketsymbol verwendet werden soll. Sie müssen die referenzierte Symbolbilddatei explizit packen. Weitere Informationen finden Sie unter Packen einer Symbolbilddatei und icon -metadaten.
IconUrl PackageIconUrl empty PackageIconUrl ist für PackageIcon. Für die beste Downlevel-Erfahrung sollten Sie jedoch zusätzlich PackageIconzu PackageIconUrl .
Readme PackageReadmeFile empty Sie müssen die referenzierte Readme-Datei explizit packen.
Tags PackageTags empty Eine durch Semikolons getrennte Liste von Tags, die das Paket festlegt.
ReleaseNotes PackageReleaseNotes empty Anmerkungen zu diesem Paket.
Repository/Url RepositoryUrl empty Repository-URL, die zum Klonen oder Abrufen von Quellcode verwendet wird. Beispiel: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git.
Repository/Type RepositoryType empty Repositorytyp. Beispiele: git (Standard), tfs.
Repository/Branch RepositoryBranch empty Optionale Repository-Verzweigungsinformationen. RepositoryUrl muss ebenfalls angegeben werden, damit diese Eigenschaft einbezogen wird. Beispiel: Master (NuGet 4.7.0+).
Repository/Commit RepositoryCommit empty Optionaler Repositorycommit oder ein Changeset, um anzugeben, für welches Quellpaket die Erstellung erfolgt ist. RepositoryUrl muss ebenfalls angegeben werden, damit diese Eigenschaft einbezogen wird. Beispiel: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+).
PackageType <PackageType>CustomType1, 1.0.0.0;CustomType2</PackageType> Gibt die beabsichtigte Verwendung des Pakets an. Pakettypen verwenden das gleiche Format wie Paket-IDs und werden durch ;Trennzeichen getrennt. Pakettypen können durch Anfügen einer , und einer Version Zeichenfolge versioniert werden. Siehe Festlegen eines NuGet Pakettyps (NuGet 3.5.0+).
Summary Nicht unterstützt

Eingaben für das Ziel „pack“

Eigenschaft BESCHREIBUNG
IsPackable Ein Boolescher Wert, der angibt, ob das Projekt verpackt werden kann. Der Standardwert ist true.
SuppressDependenciesWhenPacking Legen Sie fest, true um Paketabhängigkeiten aus dem generierten NuGet Paket zu unterdrücken.
PackageVersion Gibt die Version an, die das resultierende Paket haben wird. Akzeptiert alle Formen der NuGet Versionszeichenfolge. Standardmäßig beträgt der Wert $(Version) der Eigenschaft Version im Projekt.
PackageId Gibt den Namen für das resultierende Paket an. Wenn nicht angegeben, verwendet der pack-Vorgang standardmäßig AssemblyName oder den Verzeichnisnamen als Paketnamen.
PackageDescription Eine ausführliche Beschreibung des Pakets für die Anzeige der Benutzeroberfläche.
Authors Eine semikolonsgetrennte Liste von Paketautoren, die den Profilnamen auf nuget.org entsprechen. Diese werden in der NuGet Galerie auf nuget.org angezeigt und werden zum Referenzpaketen von denselben Autoren verwendet.
Description Eine lange Beschreibung für die Assembly. Wenn PackageDescription nicht angegeben ist, wird diese Eigenschaft auch als Beschreibung des Pakets verwendet.
Copyright Copyright-Informationen für das Paket.
PackageRequireLicenseAcceptance Ein Boolescher Wert, der angibt, ob der Client den Verbraucher dazu auffordern muss, die Paketlizenz vor der Installation des Pakets zu akzeptieren. Der Standardwert ist false.
DevelopmentDependency Ein boolescher Wert, der angibt, ob das Paket mit einer Abhängigkeit markiert werden soll, die nur für die Entwicklung gilt, wodurch vermieden wird, dass das Paket als Abhängigkeit in andere Pakete eingefügt wird. Mit (NuGet 4.8+) bedeutet diese Kennzeichnung auch, dass kompilierte Zeitressourcen aus der Kompilierung PackageReference ausgeschlossen werden. Weitere Informationen finden Sie unter DevelopmentDependency support for PackageReference (DevelopmentDependency-Unterstützung für PackageReference).
PackageLicenseExpression Ein SPDX-Lizenzbezeichner oder -Ausdruck, z Apache-2.0. B. . Weitere Informationen finden Sie unter Packen eines Lizenzausdrucks oder einer Lizenzdatei.
PackageLicenseFile Pfad zu einer Lizenzdatei innerhalb des Pakets, wenn Sie eine benutzerdefinierte Lizenz oder eine Lizenz verwenden, die nicht einem SPDX-Bezeichner zugewiesen wurde.
PackageLicenseUrl PackageLicenseUrl ist veraltet. Verwenden Sie stattdessen PackageLicenseExpression oder PackageLicenseFile.
PackageProjectUrl
PackageIcon Gibt den Paketsymbolpfad relativ zum Stamm des Pakets an. Weitere Informationen finden Sie unter Packen einer Symbolbilddatei.
PackageReleaseNotes Anmerkungen zu diesem Paket.
PackageReadmeFile Readme für das Paket.
PackageTags Eine durch Semikolons getrennte Liste von Tags, die das Paket festlegt.
PackageOutputPath Bestimmt den Ausgabepfad, in dem das gepackte Paket abgelegt wird. Der Standardwert ist $(OutputPath).
IncludeSymbols Dieser Boolesche Wert gibt an, ob das Paket ein zusätzliches Symbolpaket erstellen soll, wenn das Projekt verpackt wird. Das Format des Symbolpakets wird durch die Eigenschaft SymbolPackageFormat gesteuert. Weitere Informationen finden Sie unter IncludeSymbols.
IncludeSource Dieser Boolesche Wert gibt an, ob der Packprozess ein Quellpaket erstellen sollte. Das Quellpaket enthält den Quellcode der Bibliothek sowie die PDB-Dateien. Quelldateien werden im src/ProjectName-Verzeichnis in der resultierenden Paketdatei gespeichert. Weitere Informationen finden Sie unter IncludeSource.
PackageType
IsTool Gibt an, ob alle Ausgabedateien in den Tools-Ordner anstelle des Lib-Ordners kopiert werden. Weitere Informationen finden Sie unter IsTool.
RepositoryUrl Repository-URL, die zum Klonen oder Abrufen von Quellcode verwendet wird. Beispiel: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git.
RepositoryType Repositorytyp. Beispiele: git (Standard), tfs.
RepositoryBranch Optionale Repository-Verzweigungsinformationen. RepositoryUrl muss ebenfalls angegeben werden, damit diese Eigenschaft einbezogen wird. Beispiel: Master (NuGet 4.7.0+).
RepositoryCommit Optionaler Repositorycommit oder ein Changeset, um anzugeben, für welches Quellpaket die Erstellung erfolgt ist. RepositoryUrl muss ebenfalls angegeben werden, damit diese Eigenschaft einbezogen wird. Beispiel: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+).
SymbolPackageFormat Gibt das Format des Symbolpakets an. Wenn "symbols.nupkg" erstellt wird, wird ein Legacysymbolpaket mit einer .symbols.nupkg-Erweiterung mit PDBs, DLLs und anderen Ausgabedateien erstellt. Wenn "snupkg" erstellt wird, wird ein snupkg-Symbolpaket erstellt, das die tragbaren PDBs enthält. Der Standardwert ist "symbols.nupkg".
NoPackageAnalysis Gibt an, dass die pack Paketanalyse nach dem Erstellen des Pakets nicht ausgeführt werden sollte.
MinClientVersion Gibt die Mindestversion des NuGet Clients an, die dieses Paket installieren kann, durch nuget.exe und die Visual Studio Paket-Manager erzwungen.
IncludeBuildOutput Dieser Boolesche Wert gibt an, ob die Buildausgabeassemblys in die NUPKG-Datei gepackt werden sollen oder nicht.
IncludeContentInPack Dieser boolesche Wert gibt an, ob alle Elemente, die einen Typ Content aufweisen, automatisch im resultierenden Paket enthalten sind. Der Standardwert lautet true.
BuildOutputTargetFolder Gibt den Ordner an, in dem die Ausgabeassemblys abgelegt werden. Die Ausgabeassemblys (und andere Ausgabedateien) werden in ihre jeweiligen Frameworkordner kopiert. Weitere Informationen finden Sie unter Ausgabeassemblys.
ContentTargetFolders Gibt den Standardspeicherort an, an dem alle Inhaltsdateien gehen sollten, wenn PackagePath sie nicht angegeben werden. Der Standardwert ist „content;contentFiles“. Weitere Informationen finden Sie unter Inhalt in ein Paket einschließen.
NuspecFile Relativer oder absoluter Pfad zur Datei, die für die .nuspec Verpackung verwendet wird. Wenn angegeben, wird es ausschließlich für Verpackungsinformationen verwendet, und alle Informationen in den Projekten werden nicht verwendet. Weitere Informationen finden Sie unter Packen mit einer .nuspec.
NuspecBasePath Basispfad für die .nuspec Datei. Weitere Informationen finden Sie unter Packen mit einer .nuspec.
NuspecProperties Durch Semikolons getrennte Liste der Schlüssel = Wertpaare. Weitere Informationen finden Sie unter Packen mit einer .nuspec.

Pack-Szenarios

Unterdrücken von Abhängigkeiten

Um Paketabhängigkeiten aus generierten NuGet Paketen zu unterdrücken, legen Sie fest SuppressDependenciesWhenPackingtrue , auf welche alle Abhängigkeiten aus der generierten nupkg-Datei überspringen können.

PackageIconUrl

PackageIconUrl ist für die PackageIcon Eigenschaft veraltet. NuGet Ab 5.3 und Visual Studio 2019 Version 16.3 löst die NU5048-Warnung aus, pack wenn die Paketmetadaten nur angegeben werdenPackageIconUrl.

PackageIcon

Tipp

Um die Abwärtskompatibilität mit Clients und Quellen zu erhalten, die noch nicht unterstützt PackageIconwerden, geben Sie beide PackageIcon und PackageIconUrl. Visual Studio unterstützt PackageIcon Pakete, die aus einer ordnerbasierten Quelle stammen.

Packen einer Symbolbilddatei

Wenn Sie eine Symbolbilddatei packen, verwenden Sie PackageIcon die Eigenschaft zum Angeben des Symboldateipfads relativ zum Stamm des Pakets. Stellen Sie außerdem sicher, dass die Datei im Paket enthalten ist. Die Bilddateigröße ist auf 1 MB beschränkt. Unterstützte Dateiformate umfassen JPEG und PNG. Wir empfehlen eine Bildauflösung von 128x128.

Beispiel:

<PropertyGroup>
    ...
    <PackageIcon>icon.png</PackageIcon>
    ...
</PropertyGroup>

<ItemGroup>
    ...
    <None Include="images\icon.png" Pack="true" PackagePath="\"/>
    ...
</ItemGroup>

Beispiel für das Paketsymbol.

Schauen Sie sich für das entsprechende Symbol einen Blick aufnuspec den Verweis auf das nuspec Symbol an.

PackageReadmeFile

Unterstützt mit NuGet 5.10.0 Preview 2.NET / SDK 5.0.300 und höher

Wenn Sie eine Readme-Datei packen, müssen Sie die PackageReadmeFile Eigenschaft verwenden, um den Paketpfad anzugeben, relativ zum Stamm des Pakets. Zusätzlich dazu müssen Sie sicherstellen, dass die Datei im Paket enthalten ist. Unterstützte Dateiformate umfassen nur Markdown (.md).

Beispiel:

<PropertyGroup>
    ...
    <PackageReadmeFile>readme.md</PackageReadmeFile>
    ...
</PropertyGroup>

<ItemGroup>
    ...
    <None Include="docs\readme.md" Pack="true" PackagePath="\"/>
    ...
</ItemGroup>

Schauen Sie sich eine Referenz für Readme an.nuspecnuspec

Ausgabeassemblys

nuget pack kopiert Ausgabedateien mit den Erweiterungen .exe, .dll, .xml, .winmd, .json und .pri. Die Ausgabedateien, die kopiert werden, hängen davon ab, was MSBuild vom BuiltOutputProjectGroup Ziel bereitgestellt wird.

Es gibt zwei MSBuild Eigenschaften, die Sie in Ihrer Projektdatei oder Befehlszeile verwenden können, um zu steuern, wo Ausgabeassemblys gehen:

  • IncludeBuildOutput: Ein boolescher Wert, der bestimmt, ob die Ausgabeassemblys des Builds in das Paket eingeschlossen werden sollten.
  • BuildOutputTargetFolder: Gibt den Ordner an, in dem die Ausgabeassemblys angeordnet werden sollten. Die Ausgabeassemblys (und andere Ausgabedateien) werden in ihre jeweiligen Frameworkordner kopiert.

Paketverweise

Siehe Package References in Project Files (Paketverweise in Projektdateien).

Projekt-zu-Projekt-Verweise

Project zu Projektbezügen werden standardmäßig als NuGet Paketbezüge betrachtet. Beispiel:

<ProjectReference Include="..\UwpLibrary2\UwpLibrary2.csproj"/>

Sie können auf folgende Metadaten zu Ihrem Projektverweis hinzufügen:

<IncludeAssets>
<ExcludeAssets>
<PrivateAssets>

Einschließlich der Inhalte in einem Paket

Fügen Sie zusätzliche Metadaten zu dem vorhandenen <Content>-Element hinzu, um Inhalte einzuschließen. Standardmäßig werden alle Elemente vom Typ „Content“ in das Paket eingeschlossen, sofern Sie diese Elemente nicht mit Einträgen wie den folgenden überschreiben:

<Content Include="..\win7-x64\libuv.txt">
 <Pack>false</Pack>
</Content>

Standardmäßig werden alle Elemente zum Stammverzeichnis der Ordner content und contentFiles\any\<target_framework> innerhalb eines Pakets hinzugefügt, und die relative Ordnerstruktur wird beibehalten, sofern Sie keinen Paketpfad angeben:

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles\</PackagePath>
</Content>

Wenn Sie alle Ihre Inhalte nur in einen bestimmten Stammordner (anstelle und contentcontentFiles beides) kopieren möchten, können Sie die MSBuild Eigenschaft ContentTargetFoldersverwenden, die standardmäßig auf "content;contentFiles" festgelegt wird, aber auf alle anderen Ordnernamen festgelegt werden kann. Beachten Sie Folgendes: Wenn Sie in ContentTargetFolders nur „contentFiles“ angeben, werden Dateien unter contentFiles\any\<target_framework> oder contentFiles\<language>\<target_framework> basierend auf buildAction angeordnet.

PackagePath kann eine durch Semikolons (;) getrennte Reihe von Zielpfaden sein. Durch die Angabe eines leeren Paketpfads würde die Datei zum Stammverzeichnis des Pakets hinzugefügt. Im Folgenden wird beispielsweise libuv.txt zucontent\myfiles, content\samples und dem Stammverzeichnis des Pakets hinzugefügt:

<Content Include="..\win7-x64\libuv.txt">
  <Pack>true</Pack>
  <PackagePath>content\myfiles;content\sample;;</PackagePath>
</Content>

Es gibt auch eine MSBuild Eigenschaft $(IncludeContentInPack), die standardmäßig verwendet truewird. Wenn diese in einem Projekt auf false festgelegt wird, werden die Inhalte aus diesem Projekt nicht in das NuGet-Paket eingeschlossen.

Andere Packspezifische Metadaten, die Sie für alle oben genannten Elemente festlegen können, enthalten <PackageCopyToOutput> und <PackageFlatten> welche Werte für Flatten den Eintrag in der contentFiles Ausgabe nuspecfestgelegt CopyToOutput werden.

Hinweis

Die Metadaten <Pack> und <PackagePath> können nicht nur auf Inhaltselemente, sondern auch auf Dateien mit den Buildvorgängen „Compile“, „EmbeddedResource“, „ApplicationDefinition“, „Page“, „Resource“, „SplashScreen“, „DesignData“, „DesignDataWithDesignTimeCreateableTypes“, „CodeAnalysisDictionary“, „AndroidAsset“, „AndroidResource“, „BundleResource“ oder „None“ festgelegt werden.

Damit das Ziel „pack“ bei der Verwendung von Globmustern den Dateinamen an Ihren Paketpfad anhängt, muss Ihr Paketpfad mit dem Ordnertrennzeichen enden. Andernfalls wird der Paketpfad als vollständiger Pfad einschließlich des Dateinamens behandelt.

IncludeSymbols

Bei Verwendung von MSBuild -t:pack -p:IncludeSymbols=true werden die entsprechenden .pdb-Dateien zusammen mit anderen Ausgabedateien kopiert (.dll, .exe, .winmd, .xml, .json, .pri). Beachten Sie, dass durch das Festlegen von IncludeSymbols=true ein reguläres Paket und ein Symbolpaket erstellt werden.

IncludeSource

Dies ist mit IncludeSymbols identisch. Der einzige Unterschied besteht darin, dass Quelldateien auch zusammen mit .pdb-Dateien kopiert werden. Alle Dateien vom Typ Compile werden in src\<ProjectName>\ kopiert. Dabei wird die Ordnerstruktur im relativen Pfad im resultierenden Paket beibehalten. Gleiches gilt auch für Quelldateien einer beliebigen ProjectReference, bei der TreatAsPackageReference auf false festgelegt ist.

Wenn sich eine Datei vom Typ „Compile“ außerhalb des Projektordners befindet, wird sie nur zu src\<ProjectName>\ hinzugefügt.

Packen eines Lizenzausdrucks oder einer Lizenzdatei

Verwenden Sie bei Verwendung eines Lizenzausdrucks die PackageLicenseExpression Eigenschaft. Ein Beispiel finden Sie im Beispiel für den Lizenzausdruck.

<PropertyGroup>
    <PackageLicenseExpression>MIT</PackageLicenseExpression>
</PropertyGroup>

Weitere Informationen zu Lizenzausdrücken und Lizenzen, die von NuGet.org akzeptiert werden, finden Sie unter Lizenzmetadaten.

Verwenden Sie PackageLicenseFile beim Packen einer Lizenzdatei die Eigenschaft, um den Paketpfad relativ zum Stamm des Pakets anzugeben. Stellen Sie außerdem sicher, dass die Datei im Paket enthalten ist. Beispiel:

<PropertyGroup>
    <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
</PropertyGroup>

<ItemGroup>
    <None Include="licenses\LICENSE.txt" Pack="true" PackagePath=""/>
</ItemGroup>

Ein Beispiel finden Sie unter Lizenzdateibeispiel.

Hinweis

Nur eines von PackageLicenseExpression, PackageLicenseFileund PackageLicenseUrl kann jeweils angegeben werden.

Packen einer Datei ohne Erweiterung

In einigen Szenarien, z. B. beim Packen einer Lizenzdatei, sollten Sie eine Datei ohne Erweiterung einschließen. Aus historischen Gründen NuGet&MSBuild behandeln Sie Pfade ohne Erweiterung als Verzeichnisse.

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
    <PackageLicenseFile>LICENSE</PackageLicenseFile>
  </PropertyGroup>

  <ItemGroup>
    <None Include="LICENSE" Pack="true" PackagePath=""/>
  </ItemGroup>  

Datei ohne Erweiterungsbeispiel.

IsTool

Bei Verwendung von MSBuild -t:pack -p:IsTool=true werden alle Ausgabedateien entsprechend den Angaben im Szenario Ausgabeassemblys in den Ordner tools und nicht in den Ordner lib kopiert. Beachten Sie, dass sich dies von einem DotNetCliTool unterscheidet, das durch Festlegen von PackageType in der .csproj-Datei angegeben wird.

Packen mit einer .nuspec Datei

Obwohl es empfohlen wird, alle Eigenschaften einzuschließen , die sich normalerweise in der Datei in der .nuspec Projektdatei befinden, können Sie eine Datei verwenden .nuspec , um Ihr Projekt zu packen. Für ein Nicht-SDK-Formatprojekt, das verwendet PackageReferencewird, müssen Sie importieren NuGet.Build.Tasks.Pack.targets , damit die Packaufgabe ausgeführt werden kann. Sie müssen das Projekt weiterhin wiederherstellen, bevor Sie eine nuspec Datei packen können. (Ein SDK-Formatprojekt enthält standardmäßig die Packziele.)

Das Zielframework der Projektdatei ist irrelevant und wird beim Packen einer nuspecDatei nicht verwendet. Die folgenden drei MSBuild Eigenschaften sind für die Verpackung mit einer .nuspec:

  1. NuspecFile: Relativer oder absoluter Pfad zur .nuspec-Datei, der für das Packen verwendet wird.
  2. NuspecProperties: Durch Semikolons (;) getrennte Liste der Schlüssel/Wert-Paare. Aufgrund der Funktionsweise MSBuild der Befehlszeilenanalyse müssen mehrere Eigenschaften wie folgt angegeben werden: -p:NuspecProperties="key1=value1;key2=value2"
  3. NuspecBasePath: Der Basispfad für die .nuspec-Datei.

Wenn Sie Ihr Projekt mithilfe der Datei dotnet.exe packen, verwenden Sie einen Befehl wie den folgenden:

dotnet pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 

Wenn Sie Ihr Projekt mithilfe der Datei MSBuild packen, verwenden Sie einen Befehl wie den folgenden:

msbuild -t:pack <path to .csproj file> -p:NuspecFile=<path to nuspec file> -p:NuspecProperties=<> -p:NuspecBasePath=<Base path> 

Bitte beachten Sie, dass das Packen einer nuspec verwendung von dotnet.exe oder msbuild auch zum Standardmäßigen Erstellen des Projekts führt. Dies kann vermieden werden, indem --no-build Die Eigenschaft an dotnet.exe übergeben wird, was der Einstellung <NoBuild>true</NoBuild> in Der Projektdatei entspricht, zusammen mit der Einstellung <IncludeBuildOutput>false</IncludeBuildOutput> in der Projektdatei.

Ein Beispiel für eine CSPROJ-Datei zum Packen einer nuspec Datei ist:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <NoBuild>true</NoBuild>
    <IncludeBuildOutput>false</IncludeBuildOutput>
    <NuspecFile>PATH_TO_NUSPEC_FILE</NuspecFile>
    <NuspecProperties>add nuspec properties here</NuspecProperties>
    <NuspecBasePath>optional to provide</NuspecBasePath>
  </PropertyGroup>
</Project>

Verbesserte Erweiterungspunkte zum Erstellen benutzerdefinierter Pakete

Das pack Ziel stellt zwei Erweiterungspunkte bereit, die im inneren, zielframeworkspezifischen Build ausgeführt werden. Die Unterstützung der Erweiterungspunkte einschließlich spezifischer Zielframeworkinhalte und Assemblys in ein Paket:

  • TargetsForTfmSpecificBuildOutput target: Use for files inside the lib folder or a folder specified using BuildOutputTargetFolder.
  • TargetsForTfmSpecificContentInPackage target: Use for files outside the BuildOutputTargetFolder.

TargetsForTfmSpecificBuildOutput

Schreiben Sie ein benutzerdefiniertes Ziel, und geben Sie es als Wert der $(TargetsForTfmSpecificBuildOutput) Eigenschaft an. Für alle Dateien, die in die BuildOutputTargetFolder Datei wechseln müssen (lib standardmäßig), sollte das Ziel diese Dateien in die ItemGroup BuildOutputInPackage schreiben und die folgenden beiden Metadatenwerte festlegen:

  • FinalOutputPath: Der absolute Pfad der Datei; falls nicht angegeben, wird die Identität verwendet, um den Quellpfad auszuwerten.
  • TargetPath: (Optional) Legen Sie fest, wann die Datei in einen Unterordner in lib\<TargetFramework> einem Unterordner wechseln muss, z. B. Satellitenassemblys, die unter ihren jeweiligen Kulturordnern gehen. Standardwert ist der Name der Datei.

Beispiel:

<PropertyGroup>
  <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);GetMyPackageFiles</TargetsForTfmSpecificBuildOutput>
</PropertyGroup>

<Target Name="GetMyPackageFiles">
  <ItemGroup>
    <BuildOutputInPackage Include="$(OutputPath)cs\$(AssemblyName).resources.dll">
        <TargetPath>cs</TargetPath>
    </BuildOutputInPackage>
  </ItemGroup>
</Target>

TargetsForTfmSpecificContentInPackage

Schreiben Sie ein benutzerdefiniertes Ziel, und geben Sie es als Wert der $(TargetsForTfmSpecificContentInPackage) Eigenschaft an. Damit alle Dateien in das Paket aufgenommen werden sollen, sollte das Ziel diese Dateien in die ItemGroup TfmSpecificPackageFile schreiben und die folgenden optionalen Metadaten festlegen:

  • PackagePath: Pfad, in dem die Datei im Paket ausgegeben werden soll. NuGet gibt eine Warnung aus, wenn mehrere Dateien demselben Paketpfad hinzugefügt werden.
  • BuildAction: Die Buildaktion, die der Datei zugewiesen werden soll, ist nur erforderlich, wenn sich der Paketpfad im contentFiles Ordner befindet. Standardwert ist "None".

Beispiel:

<PropertyGroup>
  <TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);CustomContentTarget</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>

<Target Name="CustomContentTarget">
  <ItemGroup>
    <TfmSpecificPackageFile Include="abc.txt">
      <PackagePath>mycontent/$(TargetFramework)</PackagePath>
    </TfmSpecificPackageFile>
    <TfmSpecificPackageFile Include="Extensions/ext.txt" Condition="'$(TargetFramework)' == 'net46'">
      <PackagePath>net46content</PackagePath>
    </TfmSpecificPackageFile>  
  </ItemGroup>
</Target>  

Wiederherstellungsziel

Das Ziel MSBuild -t:restore (das von nuget restore und dotnet restore in .NET Core-Projekten verwendet wird), stellt wie folgt Pakete wieder her, auf die in der Projektdatei verwiesen wird:

  1. Lesen aller Projekt-zu-Projekt-Verweise
  2. Lesen der Projekteigenschaften, um den Zwischenordner und Zielframeworks zu finden
  3. Übergeben von MSBuild Daten an NuGet.Build.Tasks.dll
  4. Ausführen des Befehls „restore“
  5. Herunterladen von Paketen
  6. Schreiben von Assetdatei, Zielen und Eigenschaften

Das restore Ziel funktioniert für Projekte mit dem PackageReference-Format. MSBuild 16.5+ verfügt auch über die Opt-In-Unterstützung für das packages.config Format.

Hinweis

Das restore Ziel sollte nicht in Kombination mit dem build Ziel ausgeführt werden.

Wiederherstellen von Eigenschaften

Weitere Wiederherstellungseinstellungen können aus MSBuild Eigenschaften in der Projektdatei stammen. Werte können auch mithilfe des -p:-Switch über die Befehlszeile festgelegt werden (siehe nachfolgende Beispiele).

Eigenschaft BESCHREIBUNG
RestoreSources Eine durch Semikolons (;) getrennte Liste mit Paketquellen.
RestorePackagesPath Ordnerpfad der Pakete für Benutzer.
RestoreDisableParallel Begrenzt Downloads auf jeweils einen Download.
RestoreConfigFile Der Pfad zu einer anzuwendenden Nuget.Config-Datei.
RestoreNoCache Wenn true, vermeiden Sie die Verwendung zwischengespeicherter Pakete. Siehe Verwalten der globalen Pakete und Cacheordner.
RestoreIgnoreFailedSources Wenn „TRUE“ festgelegt ist, werden fehlerhafte oder fehlende Paketquellen ignoriert.
RestoreFallbackFolders Fallbackordner, die auf die gleiche Weise verwendet werden, wie der Ordner "Benutzerpakete" verwendet wird.
RestoreAdditionalProjectSources Zusätzliche Quellen, die während der Wiederherstellung verwendet werden sollen.
RestoreAdditionalProjectFallbackFolders Zusätzliche Fallbackordner, die während der Wiederherstellung verwendet werden sollen.
RestoreAdditionalProjectFallbackFoldersExcludes Schließt Fallbackordner aus, die in RestoreAdditionalProjectFallbackFolders
RestoreTaskAssemblyFile Pfad zu NuGet.Build.Tasks.dll.
RestoreGraphProjectInput Durch Semikolons (;) getrennte Liste mit wiederherzustellenden Projekten, die absolute Pfade enthalten sollten.
RestoreUseSkipNonexistentTargets Wenn die Projekte über MSBuild sie gesammelt werden, bestimmt sie, ob sie mithilfe der SkipNonexistentTargets Optimierung gesammelt werden. Wenn diese Einstellung nicht festgelegt ist, werden die Standardwerte auf true. Die Folge ist ein fehlerschnelles Verhalten, wenn die Ziele eines Projekts nicht importiert werden können.
MSBuildProjectExtensionsPath Ausgabeordner, Standardeinstellung BaseIntermediateOutputPath und obj Ordner.
RestoreForce In PackageReference-basierten Projekten wird erzwingt, dass alle Abhängigkeiten aufgelöst werden, auch wenn die letzte Wiederherstellung erfolgreich war. Das Angeben dieses Flags ähnelt dem Löschen der project.assets.json Datei. Dadurch wird der http-Cache nicht umgangen.
RestorePackagesWithLockFile Ermöglicht die Verwendung einer Sperrdatei.
RestoreLockedMode Führen Sie die Wiederherstellung im gesperrten Modus aus. Dies bedeutet, dass die Wiederherstellung die Abhängigkeiten nicht neu bewertet.
NuGetLockFilePath Ein benutzerdefinierter Speicherort für die Sperrdatei. Der Standardspeicherort befindet sich neben dem Projekt und wird benannt packages.lock.json.
RestoreForceEvaluate Erzwingt die Wiederherstellung, um die Abhängigkeiten neu zu kompensieren und die Sperrdatei ohne Warnung zu aktualisieren.
RestorePackagesConfig Ein Opt-In-Switch, der Projekte mit packages.config wiederherstellen kann. MSBuild -t:restore Nur Support.
RestoreRepositoryPath nur packages.config. Gibt das Paketverzeichnis an, in dem die Pakete wiederhergestellt werden sollen. SolutionDirectory wird verwendet, wenn nicht angegeben.
RestoreUseStaticGraphEvaluation Ein Opt-In zur Verwendung statischer Diagrammauswertung MSBuild anstelle der Standardauswertung. Statische Diagrammauswertung ist ein experimentelles Feature, das für große Repos- und Lösungen erheblich schneller ist.

Die ExcludeRestorePackageImports Eigenschaft ist eine interne Eigenschaft, die von NuGet. Sie sollte nicht in dateien MSBuild geändert oder festgelegt werden.

Beispiele

Befehlszeile:

msbuild -t:restore -p:RestoreConfigFile=<path>

Projektdatei:

<PropertyGroup>
    <RestoreIgnoreFailedSources>true</RestoreIgnoreFailedSources>
</PropertyGroup>

Wiederherstellen von Ausgaben

Bei der Wiederherstellung werden die folgenden Dateien im obj-Buildordner erstellt:

Datei BESCHREIBUNG
project.assets.json Enthält das Abhängigkeitsdiagramm aller Paketverweise.
{projectName}.projectFileExtension.nuget.g.props Verweise auf MSBuild In Paketen enthaltene Props
{projectName}.projectFileExtension.nuget.g.targets Verweise auf MSBuild Ziele, die in Paketen enthalten sind

Wiederherstellen und Erstellen mit einem MSBuild Befehl

Aufgrund der Tatsache, dass NuGet Pakete wiederhergestellt werden können, die Ziele und Props nach unten bringen MSBuild , werden die Wiederherstellungs- und Buildbewertungen mit unterschiedlichen globalen Eigenschaften ausgeführt. Dies bedeutet, dass im Folgenden ein unvorhersehbares und häufig falsches Verhalten vorhanden ist.

msbuild -t:restore,build

Stattdessen lautet der empfohlene Ansatz:

msbuild -t:build -restore

Die gleiche Logik gilt für andere Ziele, die ähnlich sind build.

Wiederherstellen von PackageReference- und packages.config Projekten mit MSBuild

Mit MSBuild 16,5+ werden packages.config auch für msbuild -t:restore.

msbuild -t:restore -p:RestorePackagesConfig=true

Hinweis

packages.config Wiederherstellung ist nur mit MSBuild 16.5+, und nicht mit dotnet.exe

Wiederherstellen mit MSBuild statischer Diagrammauswertung

Hinweis

Mit MSBuild 16.6+ wurde ein experimentelles Feature hinzugefügt, NuGet um statische Diagrammauswertung aus der Befehlszeile zu verwenden, die die Wiederherstellungszeit für große Repositorys erheblich verbessert.

msbuild -t:restore -p:RestoreUseStaticGraphEvaluation=true

Alternativ können Sie sie aktivieren, indem Sie die Eigenschaft in einem Directory.Build.Props festlegen.

<Project>
  <PropertyGroup>
    <RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>
  </PropertyGroup>
</Project>

Hinweis

Ab Visual Studio 2019.x und NuGet 5.x gilt dieses Feature als experimentell und opt-in. Folgen Sie NuGet/Home#9803 , um Details dazu zu erhalten, wann dieses Feature standardmäßig aktiviert ist.

Statisches Diagramm ändert den msbuild-Teil der Wiederherstellung, das Lesen und Bewerten des Projekts, aber nicht den Wiederherstellen-Algorithmus! Der Wiederherstellungsalgorithmus ist in allen NuGet Tools identisch (NuGet.exe, MSBuild.exe, dotnet.exe und Visual Studio).

In sehr wenigen Szenarien verhält sich die statische Diagrammwiederherstellung möglicherweise anders als die aktuelle Wiederherstellung, und bestimmte deklarierte PackageReferences oder ProjectReferences fehlen möglicherweise.

Um Ihre Meinung zu erleichtern, sollten Sie beim Migrieren zur statischen Diagrammwiederherstellung eine einmalige Überprüfung ausführen:

msbuild.exe -t:restore -p:RestoreUseStaticGraphEvaluation=true
msbuild.exe -t:restore

NuGet sollte keine Änderungen melden. Wenn eine Diskrepanz angezeigt wird, übermitteln Sie bitte ein Problem bei NuGet/Home.

Ersetzen einer Bibliothek aus einem Wiederherstellungsdiagramm

Wenn bei einer Wiederherstellung die falsche Assembly eingebunden wurde, kann diese Paketstandardauswahl ausgeschlossen und durch Ihre eigene Wahl ersetzt werden. Schließen Sie zunächst mit einem PackageReference-Element der obersten Ebene alle Objekte aus:

<PackageReference Include="Newtonsoft.Json" Version="9.0.1">
  <ExcludeAssets>All</ExcludeAssets>
</PackageReference>

Fügen Sie als Nächstes Ihren eigenen Verweis zur entsprechenden lokalen Kopie der DLL hinzu:

<Reference Include="Newtonsoft.Json.dll" />