NuGet pack and restore as MSBuild targets

NuGet 4.0+

Ve formátu NuGet PackageReference může verze 4.0+ ukládat všechna metadata manifestu přímo do souboru projektu místo použití samostatného .nuspec souboru.

S MSBuild 15,1+ NuGet je také prvotřídní MSBuild občan s pack cíli a restore cíli, jak je popsáno níže. Tyto cíle umožňují pracovat stejně NuGet jako s jakýmkoli jiným MSBuild úkolem nebo cílem. Pokyny k NuGet vytvoření balíčku pomocí MSBuildnaleznete v tématu Vytvoření NuGet balíčku pomocí MSBuild. (Pro NuGet 3.x a starší, místo toho použijete příkazy balíčku a obnovení prostřednictvím rozhraní příkazového NuGet řádku.)

Pořadí sestavení cílů

Vzhledem k tomu pack , že jsou restoreMSBuild cíle, můžete k nim přistupovat a vylepšit tak pracovní postup. Řekněme například, že chcete balíček po zabalení zkopírovat do sdílené síťové složky. Můžete to udělat tak, že do souboru projektu přidáte následující:

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

Podobně můžete napsat MSBuild úkol, napsat vlastní cíl a využívat NuGet vlastnosti v MSBuild úkolu.

Poznámka:

$(OutputPath) je relativní a očekává, že příkaz spouštíte z kořenového adresáře projektu.

cíl balíčku

Pro projekty .NET, které používají PackageReference formát, pomocí nakreslí msbuild -t:pack vstupy ze souboru projektu, které se použijí při vytváření NuGet balíčku.

Následující tabulka popisuje MSBuild vlastnosti, které lze přidat do souboru projektu v rámci prvního <PropertyGroup> uzlu. Tyto úpravy můžete snadno provést v sadě Visual Studio 2017 a novějších kliknutím pravým tlačítkem myši na projekt a výběrem možnosti Upravit {project_name} v místní nabídce. Pro usnadnění je tabulka uspořádaná podle ekvivalentní vlastnosti v .nuspec souboru.

Poznámka:

Owners a Summary vlastnosti z .nuspec nejsou podporovány s MSBuild.

Atribut nebonuspec hodnota MSBuild Vlastnost Výchozí Notes
Id PackageId $(AssemblyName) $(AssemblyName) Z MSBuild
Version PackageVersion Verze To je kompatibilní semver, například 1.0.0, 1.0.0-betanebo 1.0.0-beta-00345. Výchozí hodnota je Version , pokud není nastavená.
VersionPrefix VersionPrefix empty Nastavení PackageVersion přepsání VersionPrefix
VersionSuffix VersionSuffix empty Nastavení PackageVersion přepsání VersionSuffix
Authors Authors Uživatelské jméno aktuálního uživatele Seznam autorů balíčků oddělený středníkem, který odpovídá názvům profilů v nuget.org. Ty se zobrazují v NuGet galerii na nuget.org a používají se k křížovému odkazování balíčků stejnými autory.
Owners Není přítomno v nuspec
Title Title $(PackageId) Popisný název balíčku, který se obvykle používá v uživatelském rozhraní, se zobrazuje jako v nuget.org a Správce balíčků v sadě Visual Studio.
Description Description "Popis balíčku" Dlouhý popis sestavení. Pokud PackageDescription není zadána, tato vlastnost se také používá jako popis balíčku.
Copyright Copyright empty Podrobnosti o autorských právech pro balíček.
RequireLicenseAcceptance PackageRequireLicenseAcceptance false Logická hodnota, která určuje, zda klient musí před instalací balíčku vyzvat příjemce k přijetí licence balíčku.
license PackageLicenseExpression empty <license type="expression">Odpovídá . Viz Balení licenčního výrazu nebo licenčního souboru.
license PackageLicenseFile empty Cesta k souboru licence v balíčku, pokud používáte vlastní licenci nebo licenci, která nemá přiřazený identifikátor SPDX. Musíte explicitně zabalit odkazovaný licenční soubor. <license type="file">Odpovídá . Viz Balení licenčního výrazu nebo licenčního souboru.
LicenseUrl PackageLicenseUrl empty PackageLicenseUrl je zastaralý. Použijte PackageLicenseExpression nebo PackageLicenseFile místo toho.
ProjectUrl PackageProjectUrl empty
Icon PackageIcon empty Cesta k obrázku v balíčku, která se má použít jako ikona balíčku. Musíte explicitně zabalit odkazovaný soubor obrázku ikony. Další informace naleznete v tématu Balení souboru obrázku ikony a icon metadata.
IconUrl PackageIconUrl empty PackageIconUrl je zastaralá ve prospěch PackageIcon. Pro nejlepší nižší úroveň prostředí byste však měli kromě PackageIconUrlPackageIcon.
Readme PackageReadmeFile empty Musíte explicitně zabalit odkazovaný soubor readme.
Tags PackageTags empty Seznam značek oddělených středníkem, který označuje balíček.
ReleaseNotes PackageReleaseNotes empty Poznámky k verzi balíčku
Repository/Url RepositoryUrl empty Adresa URL úložiště používaná ke klonování nebo načítání zdrojového kódu. Příklad: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git.
Repository/Type RepositoryType empty Typ úložiště. Příklady: git (výchozí), tfs.
Repository/Branch RepositoryBranch empty Volitelné informace o větvi úložiště RepositoryUrl musí být také zadána pro tuto vlastnost, která má být zahrnuta. Příklad: master (NuGet 4.7.0+).
Repository/Commit RepositoryCommit empty Volitelné potvrzení úložiště nebo sada změn označující, pro který zdroj byl balíček sestaven. RepositoryUrl musí být také zadána pro tuto vlastnost, která má být zahrnuta. Příklad: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+).
PackageType <PackageType>CustomType1, 1.0.0.0;CustomType2</PackageType> Označuje zamýšlené použití balíčku. Typy balíčků používají stejný formát jako ID balíčků a jsou oddělené .; Typy balíčků můžou být verzí pomocí připojení , a Version řetězce. Viz Nastavení NuGet typu balíčku (NuGet 3.5.0+).
Summary Nepodporováno

cílové vstupy balíčku

Vlastnost Popis
IsPackable Logická hodnota, která určuje, zda lze projekt zabalit. Výchozí hodnota je true.
SuppressDependenciesWhenPacking Nastavte na true potlačení závislostí balíčku z vygenerovaného NuGet balíčku.
PackageVersion Určuje verzi, kterou bude mít výsledný balíček. Přijímá všechny formy NuGet řetězce verze. Výchozí hodnota je hodnota $(Version)vlastnosti Version v projektu.
PackageId Určuje název výsledného balíčku. Pokud není zadáno, použije operace pack jako AssemblyName název balíčku výchozí název nebo název adresáře.
PackageDescription Dlouhý popis balíčku pro zobrazení uživatelského rozhraní.
Authors Seznam autorů balíčků oddělený středníkem, který odpovídá názvům profilů v nuget.org. Ty se zobrazují v NuGet galerii na nuget.org a používají se k křížovému odkazování balíčků stejnými autory.
Description Dlouhý popis sestavení. Pokud PackageDescription není zadána, tato vlastnost se také používá jako popis balíčku.
Copyright Podrobnosti o autorských právech pro balíček.
PackageRequireLicenseAcceptance Logická hodnota, která určuje, zda klient musí před instalací balíčku vyzvat příjemce k přijetí licence balíčku. Výchozí hodnota je false.
DevelopmentDependency Logická hodnota, která určuje, jestli je balíček označen jako závislost určená jen pro vývoj, což brání zahrnutí balíčku jako závislosti v jiných balíčcích. U PackageReference (NuGet 4.8+) tento příznak také znamená, že prostředky kompilace jsou vyloučené z kompilace. Další informace naleznete v tématu DevelopmentDependency support for PackageReference.
PackageLicenseExpression Identifikátor licence SPDX nebo výraz, Apache-2.0například . Další informace naleznete v tématu Balení výrazu licence nebo souboru licence.
PackageLicenseFile Cesta k souboru licence v balíčku, pokud používáte vlastní licenci nebo licenci, která nemá přiřazený identifikátor SPDX.
PackageLicenseUrl PackageLicenseUrl je zastaralý. Použijte PackageLicenseExpression nebo PackageLicenseFile místo toho.
PackageProjectUrl
PackageIcon Určuje cestu ikony balíčku vzhledem ke kořenovému adresáři balíčku. Další informace naleznete v tématu Balení souboru obrázku ikony.
PackageReleaseNotes Poznámky k verzi balíčku
PackageReadmeFile Readme pro balíček.
PackageTags Seznam značek oddělených středníkem, který označuje balíček.
PackageOutputPath Určuje výstupní cestu, ve které se zabalený balíček zahodí. Výchozí hodnota je $(OutputPath).
IncludeSymbols Tato logická hodnota označuje, jestli má balíček při zabalení projektu vytvořit další balíček symbolů. Formát balíčku symbolů je řízen SymbolPackageFormat vlastností. Další informace naleznete v tématu IncludeSymbols.
IncludeSource Tato logická hodnota označuje, jestli má proces balíčku vytvořit zdrojový balíček. Zdrojový balíček obsahuje zdrojový kód knihovny i soubory PDB. Zdrojové soubory se umístí do src/ProjectName adresáře do výsledného souboru balíčku. Další informace naleznete v tématu IncludeSource.
PackageType
IsTool Určuje, jestli se všechny výstupní soubory zkopírují do složky nástrojů místo do složky lib . Další informace naleznete v tématu IsTool.
RepositoryUrl Adresa URL úložiště používaná ke klonování nebo načítání zdrojového kódu. Příklad: https://github.com/NuGethttps://github.com/NuGet/NuGet.Client.git.
RepositoryType Typ úložiště. Příklady: git (výchozí), tfs.
RepositoryBranch Volitelné informace o větvi úložiště RepositoryUrl musí být také zadána pro tuto vlastnost, která má být zahrnuta. Příklad: master (NuGet 4.7.0+).
RepositoryCommit Volitelné potvrzení úložiště nebo sada změn označující, pro který zdroj byl balíček sestaven. RepositoryUrl musí být také zadána pro tuto vlastnost, která má být zahrnuta. Příklad: 0e4d1b598f350b3dc675018d539114d1328189ef (NuGet 4.7.0+).
SymbolPackageFormat Určuje formát balíčku symbolů. Pokud "symbols.nupkg", vytvoří se starší balíček symbolů s příponou .symbols.nupkg obsahující soubory PDB, knihovny DLL a další výstupní soubory. Pokud "snupkg", vytvoří se balíček symbolů snupkg obsahující přenosné soubory PDB. Výchozí hodnota je symbols.nupkg.
NoPackageAnalysis Určuje, že pack se po sestavení balíčku nespustí analýza balíčku.
MinClientVersion Určuje minimální verzi NuGet klienta, která může nainstalovat tento balíček vynucený nuget.exe a Správce balíčků sady Visual Studio.
IncludeBuildOutput Tato logická hodnota určuje, zda mají být výstupní sestavení sestavení zabalena do souboru .nupkg , nebo ne.
IncludeContentInPack Tato logická hodnota určuje, zda jsou všechny položky, které mají typ Content , zahrnuty do výsledného balíčku automaticky. Výchozí hodnota je true.
BuildOutputTargetFolder Určuje složku, kam se mají umístit výstupní sestavení. Výstupní sestavení (a další výstupní soubory) se zkopírují do příslušných složek architektury. Další informace naleznete v tématu Výstupní sestavení.
ContentTargetFolders Určuje výchozí umístění, kam mají všechny soubory obsahu přejít, pokud PackagePath pro ně nejsou zadané. Výchozí hodnota je "content; contentFiles". Další informace naleznete v tématu Zahrnutí obsahu do balíčku.
NuspecFile Relativní nebo absolutní cesta k souboru použitému .nuspec k balení. Pokud je zadáno, používá se výhradně pro balení informací a všechny informace v projektech se nepoužívají. Další informace naleznete v tématu Balení pomocí ..nuspec
NuspecBasePath Základní cesta k .nuspec souboru. Další informace naleznete v tématu Balení pomocí ..nuspec
NuspecProperties Středník oddělený seznam párů klíč=hodnota Další informace naleznete v tématu Balení pomocí ..nuspec

Scénáře balíčků

Potlačení závislostí

Pokud chcete potlačit závislosti balíčku z vygenerovaného NuGet balíčku, nastavte SuppressDependenciesWhenPacking na to, aby true bylo možné přeskočit všechny závislosti ze vygenerovaného souboru nupkg.

PackageIconUrl

PackageIconUrl je zastaralá ve prospěch nemovitosti PackageIcon . NuGet Počínaje verzí 5.3 a sadou Visual Studio 2019 verze 16.3 vyvolá upozornění NU5048, pack pokud metadata balíčku pouze specifikují PackageIconUrl.

PackageIcon

Tip

Chcete-li zachovat zpětnou kompatibilitu s klienty a zdroji, které ještě nepodporují PackageIcon, zadejte oba PackageIcon a PackageIconUrl. Visual Studio podporuje PackageIcon balíčky pocházející ze zdroje založeného na složce.

Balení souboru obrázku ikony

Při balení souboru obrázku ikony použijte PackageIcon vlastnost k určení cesty k souboru ikony vzhledem ke kořenovému adresáři balíčku. Kromě toho se ujistěte, že je soubor součástí balíčku. Velikost souboru obrázku je omezená na 1 MB. Mezi podporované formáty souborů patří JPEG a PNG. Doporučujeme rozlišení obrázku 128x128.

Příklad:

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

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

Ukázka ikony balíčku

V případě ekvivalentu nuspec se podívejte na nuspec ikonu odkazu.

PackageReadmeFile

Podporováno ve verzi NuGet 5.10.0 Preview 2.NET / SDK 5.0.300 a vyšší

Při balení souboru readme je nutné použít PackageReadmeFile vlastnost k určení cesty balíčku vzhledem ke kořenovému adresáři balíčku. Kromě toho je potřeba zajistit, aby byl soubor součástí balíčku. Podporované formáty souborů zahrnují pouze Markdown (.md).

Příklad:

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

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

nuspec Pro ekvivalent se podívejte na nuspec referenční informace o souboru readme.

Výstupní sestavení

nuget packzkopíruje výstupní soubory s příponou .exe, , .dll.xml, .winmd.jsona .pri. Výstupní soubory, které se zkopírují, závisí na tom, co MSBuild poskytuje cíl BuiltOutputProjectGroup .

V souboru projektu nebo příkazovém řádku můžete použít dvě MSBuild vlastnosti, které určují, kam výstupní sestavení patří:

  • IncludeBuildOutput: Logická hodnota, která určuje, zda mají být výstupní sestavení sestavení zahrnuta do balíčku.
  • BuildOutputTargetFolder: Určuje složku, do které se mají umístit výstupní sestavení. Výstupní sestavení (a další výstupní soubory) se zkopírují do příslušných složek architektury.

Odkazy na balíčky

Viz odkazy na balíčky v souborech projektu.

Odkazy na projekt do projektu

Odkazy projektu na projekt se ve výchozím nastavení považují za NuGet odkazy na balíčky. Příklad:

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

Do odkazu na projekt můžete přidat také následující metadata:

<IncludeAssets>
<ExcludeAssets>
<PrivateAssets>

Zahrnutí obsahu do balíčku

Pokud chcete zahrnout obsah, přidejte k existující <Content> položce další metadata. Ve výchozím nastavení se veškerý typ "Obsah" zahrne do balíčku, pokud nepřepíšete položky jako následující:

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

Ve výchozím nastavení se všechno přidá do kořenového content adresáře a contentFiles\any\<target_framework> složky v rámci balíčku a zachová relativní strukturu složek, pokud nezadáte cestu k balíčku:

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

Pokud chcete zkopírovat veškerý obsah pouze do konkrétních kořenových složek (místo content obojího contentFiles ), můžete použít MSBuild vlastnost ContentTargetFolders, která ve výchozím nastavení "obsah; contentFiles" ale lze nastavit na jakékoli jiné názvy složek. Všimněte si, že stačí zadat "contentFiles" do ContentTargetFolders souborů nebo contentFiles\<language>\<target_framework>contentFiles\any\<target_framework> na základě nich buildAction.

PackagePath může být středník oddělená sadou cílových cest. Zadáním prázdné cesty balíčku by se soubor přidal do kořenového adresáře balíčku. Například následující přidá libuv.txt do content\myfilessouboru , content\samplesa kořen balíčku:

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

K dispozici je také MSBuild vlastnost $(IncludeContentInPack), která ve výchozím nastavení true. Pokud je tato možnost nastavená na false jakýkoli projekt, obsah z tohoto projektu není součástí balíčku NuGet.

Další metadata specifická pro balíček, která můžete nastavit pro kteroukoli z výše uvedených položek, a <PackageCopyToOutput><PackageFlatten> které nastaví CopyToOutput a Flatten hodnoty contentFiles položky ve výstupu nuspec.

Poznámka:

Kromě položek <Pack> obsahu lze také nastavit metadata a <PackagePath> soubory pomocí akce sestavení Compile, EmbeddedResource, ApplicationDefinition, Page, Resource, SplashScreen, DesignData, DesignData, DesignDataWithDesignTimeCreateableTypes, CodeAnalysisDictionary, AndroidAsset, AndroidResource, BundleResource nebo None.

Aby balíček při použití vzorů globbingu připojil název souboru k cestě balíčku, musí cesta balíčku končit znakem oddělovače složek, jinak se cesta balíčku považuje za úplnou cestu včetně názvu souboru.

IncludeSymbols

Při použití MSBuild -t:pack -p:IncludeSymbols=truese odpovídající .pdb soubory zkopírují spolu s dalšími výstupními soubory (.dll, .exe, .winmd, .xml, , .json). .pri Všimněte si, že nastavení IncludeSymbols=true vytvoří běžný balíček a balíček symbolů.

IncludeSource

To je stejné jako IncludeSymbols, s tím rozdílem, že kopíruje zdrojové soubory spolu se .pdb soubory také. Všechny soubory typu Compile se zkopírují za účelem src\<ProjectName>\ zachování struktury složky relativní cesty ve výsledném balíčku. Totéž platí také pro zdrojové soubory všech ProjectReference , které jsou nastaveny TreatAsPackageReference na false.

Pokud je soubor typu Kompilace, je mimo složku projektu, je právě přidán do src\<ProjectName>\.

Balení licenčního výrazu nebo licenčního souboru

Při použití licenčního výrazu PackageLicenseExpression použijte vlastnost. Ukázku najdete v ukázce výrazu licence.

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

Další informace o licenčních výrazech a licencích, NuGetkteré přijímá .org, najdete v metadatech licencí.

Při balení licenčního souboru použijte PackageLicenseFile vlastnost k určení cesty k balíčku vzhledem ke kořenovému adresáři balíčku. Kromě toho se ujistěte, že je soubor součástí balíčku. Příklad:

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

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

Ukázku najdete v ukázce licenčního souboru.

Poznámka:

Pouze jeden z PackageLicenseExpression, PackageLicenseFilea PackageLicenseUrl lze zadat najednou.

Balení souboru bez přípony

V některých scénářích, například při balení licenčního souboru, můžete chtít zahrnout soubor bez přípony. Z historických důvodů NuGet a MSBuild zacházíme s cestami bez rozšíření jako adresářů.

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

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

Soubor bez ukázky přípony

IsTool

Při použití MSBuild -t:pack -p:IsTool=true, všechny výstupní soubory, jak je uvedeno ve scénáři výstupní sestavení , se zkopírují do tools složky místo lib složky. Všimněte si, že se liší od toho DotNetCliTool , který je určen nastavením PackageType v .csproj souboru.

Balení pomocí .nuspec souboru

I když se doporučuje zahrnout všechny vlastnosti , které jsou obvykle v .nuspec souboru v souboru projektu, můžete se rozhodnout použít .nuspec soubor k zabalení projektu. Pro projekt, který nepoužívá sadu SDK, který používá PackageReference, je nutné importovat NuGet.Build.Tasks.Pack.targets , aby bylo možné spustit úlohu balíčku. Než budete moct zabalit nuspec soubor, musíte projekt obnovit. (Projekt ve stylu sady SDK obsahuje cíle balíčku ve výchozím nastavení.)

Cílová architektura souboru projektu je irelevantní a nepoužívá se při balení nuspec. Následující tři MSBuild vlastnosti jsou relevantní pro balení pomocí .nuspec:

  1. NuspecFile: relativní nebo absolutní cesta k souboru používanému .nuspec k balení.
  2. NuspecProperties: středník oddělený seznam párů klíč=hodnota. Vzhledem ke způsobu, jakým MSBuild funguje analýza příkazového řádku, musí být zadáno více vlastností takto: -p:NuspecProperties="key1=value1;key2=value2".
  3. NuspecBasePath: Základní cesta k .nuspec souboru.

Pokud k zabalení projektu používáte dotnet.exe příkaz podobný tomuto:

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

Pokud k zabalení projektu používáte MSBuild příkaz podobný tomuto:

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

Mějte na paměti, že balení nuspec pomocí dotnet.exe nebo msbuild vede také k sestavení projektu ve výchozím nastavení. Můžete se tomu vyhnout předáním --no-build vlastnosti do dotnet.exe, což je ekvivalent nastavení <NoBuild>true</NoBuild> v souboru projektu spolu s nastavením <IncludeBuildOutput>false</IncludeBuildOutput> v souboru projektu.

Příkladem souboru .csproj pro zabalení nuspec souboru je:

<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>

Pokročilé body rozšíření pro vytvoření přizpůsobeného balíčku

Cíl pack poskytuje dva body rozšíření, které běží ve vnitřním sestavení specifickém pro cílovou architekturu. Body rozšíření podporují, včetně obsahu a sestavení specifického pro cílovou architekturu do balíčku:

  • TargetsForTfmSpecificBuildOutput target: Slouží pro soubory uvnitř lib složky nebo složky zadané pomocí BuildOutputTargetFolder.
  • TargetsForTfmSpecificContentInPackagetarget: Používá se pro soubory mimo .BuildOutputTargetFolder

TargetsForTfmSpecificBuildOutput

Napište vlastní cíl a zadejte ho $(TargetsForTfmSpecificBuildOutput) jako hodnotu vlastnosti. Pro všechny soubory, které potřebují přejít do BuildOutputTargetFolder knihovny (lib ve výchozím nastavení), by měl cíl tyto soubory zapsat do skupiny ItemGroup BuildOutputInPackage a nastavit následující dvě hodnoty metadat:

  • FinalOutputPath: Absolutní cesta k souboru; Pokud není k dispozici, použije se identita k vyhodnocení zdrojové cesty.
  • TargetPath: (Volitelné) Nastavte, když soubor musí přejít do podsložky v rámci lib\<TargetFramework> , jako jsou satelitní sestavení, která procházejí pod příslušnými složkami jazykové verze. Výchozí hodnota je název souboru.

Příklad:

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

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

TargetsForTfmSpecificContentInPackage

Napište vlastní cíl a zadejte ho $(TargetsForTfmSpecificContentInPackage) jako hodnotu vlastnosti. Aby se do balíčku zahrnuly všechny soubory, měl by cíl tyto soubory zapsat do skupiny ItemGroup TfmSpecificPackageFile a nastavit následující volitelná metadata:

  • PackagePath: Cesta, kde má být soubor výstupem v balíčku. NuGet zobrazí upozornění, pokud je do stejné cesty balíčku přidáno více souborů.
  • BuildAction: Akce sestavení, která se má přiřadit k souboru, je nutná pouze v případě, že je cesta k balíčku ve contentFiles složce. Výchozí hodnota je Žádná.

Příklad:

<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>  

obnovení cíle

MSBuild -t:restore (které nuget restore a dotnet restore používá se projekty .NET Core), obnoví balíčky odkazované v souboru projektu následujícím způsobem:

  1. Čtení všech odkazů na projekt
  2. Čtení vlastností projektu a vyhledání zprostředkující složky a cílových architektur
  3. Předat MSBuild data do NuGet. Build.Tasks.dll
  4. Spuštění obnovení
  5. Stažení balíčků
  6. Zápis souboru, cílů a bodů prostředků

Cíl restore funguje pro projekty ve formátu PackageReference. MSBuild 16.5+má také podporu výslovného souhlasu s formátempackages.config.

Poznámka:

Cíl restoreby neměl být spuštěn v kombinaci s build cílem.

Obnovit vlastnosti

Další nastavení obnovení můžou pocházet z MSBuild vlastností v souboru projektu. Hodnoty lze také nastavit z příkazového -p: řádku pomocí přepínače (viz příklady níže).

Vlastnost Popis
RestoreSources Seznam zdrojů balíčků oddělený středníkem
RestorePackagesPath Cesta ke složce balíčků uživatelů
RestoreDisableParallel Omezit stahování na jeden po druhém.
RestoreConfigFile Cesta k Nuget.Config souboru, který se má použít.
RestoreNoHttpCache Pokud je pravda, vyhněte se používání balíčků uložených v mezipaměti http. Viz Správa globálních balíčků a složek mezipaměti.
RestoreIgnoreFailedSources Pokud je true, ignoruje selhávající nebo chybějící zdroje balíčků.
RestoreFallbackFolders Náhradní složky, které se používají stejným způsobem jako složka balíčků uživatelů.
RestoreAdditionalProjectSources Další zdroje, které se mají použít během obnovení.
RestoreAdditionalProjectFallbackFolders Další záložní složky, které se mají použít během obnovení.
RestoreAdditionalProjectFallbackFoldersExcludes Vyloučení náhradních složek zadaných v RestoreAdditionalProjectFallbackFolders
RestoreTaskAssemblyFile Cesta k NuGet.Build.Tasks.dll.
RestoreGraphProjectInput Seznam projektů oddělených středníkem, které mají být obnoveny, které by měly obsahovat absolutní cesty.
RestoreUseSkipNonexistentTargets Když se projekty shromažďují prostřednictvím MSBuild něj, určuje, jestli se shromažďují pomocí SkipNonexistentTargets optimalizace. Pokud není nastaveno, použije se výchozí hodnota true. Výsledkem je rychlé chování při selhání, pokud cíle projektu nelze importovat.
MSBuildProjectExtensionsPath Výstupní složka, výchozí hodnota BaseIntermediateOutputPath složky a obj složka.
RestoreForce V projektech založených na PackageReference vynutí vyřešení všech závislostí, i když bylo poslední obnovení úspěšné. Určení tohoto příznaku project.assets.json je podobné odstranění souboru. Tím nedojde k obejití mezipaměti http-cache.
RestorePackagesWithLockFile Přihlásí se k používání zamykacího souboru.
RestoreLockedMode Spusťte obnovení v uzamčeném režimu. To znamená, že obnovení znovu nevyhodnotí závislosti.
NuGetLockFilePath Vlastní umístění souboru zámku. Výchozí umístění je vedle projektu a má název packages.lock.json.
RestoreForceEvaluate Vynutí obnovení, aby znovu zkompilovat závislosti a aktualizoval soubor zámku bez upozornění.
RestorePackagesConfig Přepínač výslovného souhlasu, který obnoví projekty pomocí packages.config. Podpora pouze s MSBuild -t:restore .
RestoreRepositoryPath packages.config. Určuje adresář balíčků, do kterého se mají balíčky obnovit. SolutionDirectory bude použita, pokud není zadána.
RestoreUseStaticGraphEvaluation Přepínač výslovného souhlasu, který místo standardního vyhodnocení používá vyhodnocení statického grafu MSBuild . Vyhodnocení statického grafu je experimentální funkce, která je výrazně rychlejší pro velká úložiště a řešení.

Vlastnost ExcludeRestorePackageImports je interní vlastnost, kterou NuGetpoužívá . Nemělo by být změněno ani nastaveno v žádných MSBuild souborech.

Příklady

Příkazový řádek:

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

Soubor projektu:

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

Obnovení výstupů

Obnovení vytvoří ve složce sestavení obj následující soubory:

Soubor Popis
project.assets.json Obsahuje graf závislostí všech odkazů na balíčky.
{projectName}.projectFileExtension.nuget.g.props Odkazy na MSBuild props obsažené v balíčcích
{projectName}.projectFileExtension.nuget.g.targets Odkazy na MSBuild cíle obsažené v balíčcích

Obnovení a sestavení jedním příkazem MSBuild

Vzhledem k tomu, že lze obnovit balíčky, NuGet které spouštějí MSBuild cíle a props, se spustí vyhodnocení obnovení a sestavení s různými globálními vlastnostmi. To znamená, že následující chování bude mít nepředvídatelné a často nesprávné chování.

msbuild -t:restore,build

Místo toho doporučujeme:

msbuild -t:build -restore

Stejná logika se vztahuje na jiné cíle podobné build.

Obnovení projektů PackageReference a packages.config pomocí MSBuild

S verzemi MSBuild 16.5+ jsou podporovány msbuild -t:restoretaké packages.config .

msbuild -t:restore -p:RestorePackagesConfig=true

Poznámka:

packages.config obnovení je k dispozici pouze s MSBuild 16.5+, a ne s dotnet.exe

Obnovení pomocí vyhodnocení statického MSBuild grafu

Poznámka:

Ve MSBuild verzi 16.6+ byla přidána experimentální funkce pro použití vyhodnocení statického grafu z příkazového řádku, NuGet která výrazně zlepšuje dobu obnovení velkých úložišť.

msbuild -t:restore -p:RestoreUseStaticGraphEvaluation=true

Případně ji můžete povolit nastavením vlastnosti v adresáři.Build.Props.

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

Poznámka:

Od sady Visual Studio 2019.x a NuGet 5.x se tato funkce považuje za experimentální a opt-in. Podrobnosti o tom, kdy bude tato funkce ve výchozím nastavení povolená, najdete v NuGetsouboru /Home#9803 .

Statické obnovení grafu změní část obnovení msbuild, čtení a vyhodnocení projektu, ale ne algoritmus obnovení! Algoritmus obnovení je stejný ve všech NuGet nástrojích (NuGet.exe, MSBuild.exe, dotnet.exe a Visual Studio).

Ve velmi několika scénářích se statické obnovení grafu může chovat jinak než aktuální obnovení a některé deklarované PackageReferences nebo ProjectReferences můžou chybět.

Při jednorázové kontrole při migraci na statické obnovení grafu zvažte spuštění:

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

NuGetby neměly hlásit žádné změny. Pokud se zobrazí nesrovnalosti, zapište problém na NuGetadrese /Home.

Nahrazení jedné knihovny z grafu obnovení

Pokud obnovení přináší nesprávné sestavení, je možné vyloučit výchozí volbu balíčků a nahradit ho vlastní volbou. Nejprve s nejvyšší úrovní PackageReferencevylučte všechny prostředky:

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

Dále přidejte vlastní odkaz na příslušnou místní kopii knihovny DLL:

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