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 pack
restore
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
Owners
und 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-beta oder 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 PackageIcon zu 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 SuppressDependenciesWhenPacking
true
, 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 PackageIcon
werden, 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>
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 content
contentFiles
beides) kopieren möchten, können Sie die MSBuild Eigenschaft ContentTargetFolders
verwenden, 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 true
wird. 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
, PackageLicenseFile
und 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 PackageReference
wird, 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
:
NuspecFile
: Relativer oder absoluter Pfad zur.nuspec
-Datei, der für das Packen verwendet wird.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"
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 thelib
folder or a folder specified usingBuildOutputTargetFolder
.TargetsForTfmSpecificContentInPackage
target: Use for files outside theBuildOutputTargetFolder
.
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 inlib\<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 imcontentFiles
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:
- Lesen aller Projekt-zu-Projekt-Verweise
- Lesen der Projekteigenschaften, um den Zwischenordner und Zielframeworks zu finden
- Übergeben von MSBuild Daten an NuGet.Build.Tasks.dll
- Ausführen des Befehls „restore“
- Herunterladen von Paketen
- 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" />