Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Moderní projekty .NET jsou přidružené k sadě SDK (Project Software Development Kit). Každá sada SDK projektu je sada cílů MSBuild a přidružených úkolů, které zodpovídají za kompilaci, balení a publikování kódu. Projekt, který odkazuje na sadu SDK projektu, se někdy označuje jako projekt ve stylu sady SDK.
Dostupné sady SDK
Mezi dostupné sady SDK patří:
Průkaz totožnosti | Popis | Repozitář |
---|---|---|
Microsoft.NET.Sdk |
Sada .NET SDK | https://github.com/dotnet/sdk |
Microsoft.NET.Sdk.Web |
Webová sada .NET SDK | https://github.com/dotnet/sdk |
Microsoft.NET.Sdk.Razor |
Sada .NET Razor SDK | https://github.com/dotnet/aspnetcore |
Microsoft.NET.Sdk.BlazorWebAssembly |
Sada .NET Blazor WebAssembly SDK | https://github.com/dotnet/aspnetcore |
Microsoft.NET.Sdk.Worker |
Sada nástrojů pro službu pracovník .NET SDK | https://github.com/dotnet/aspnetcore |
Aspire.AppHost.Sdk |
Sada .NET Aspire SDK | https://github.com/dotnet/aspire |
MSTest.Sdk |
Sada nástrojů MSTest SDK | https://github.com/microsoft/testfx |
.NET SDK je základní sada SDK pro .NET. Ostatní sady SDK odkazují na sadu .NET SDK a projekty, které jsou přidružené k ostatním sadám SDK, mají k dispozici všechny vlastnosti sady .NET SDK. Například webová sada SDK závisí na sadě .NET SDK i na sadě Razor SDK.
Pro projekty Windows Forms a Windows Presentation Foundation (WPF) zadáte sadu .NET SDK (Microsoft.NET.Sdk
) a v souboru projektu nastavíte některé další vlastnosti. Další informace naleznete v tématu Povolení sady .NET Desktop SDK.
Sady SDK pro MSBuild, které můžete použít ke konfiguraci a rozšíření svého sestavení, jsou uvedeny v části MSBuild SDKs.
Můžete také vytvořit vlastní sadu SDK, kterou je možné distribuovat prostřednictvím NuGetu.
Soubory projektu
Projekty .NET jsou založeny na formátu MSBuild . Soubory projektu, které mají přípony jako .csproj pro projekty jazyka C# a .fsproj pro projekty F#, jsou ve formátu XML. Kořenový prvek souboru projektu MSBuild je Project element. Element Project
má volitelný Sdk
atribut, který určuje, která sada SDK (a verze) se má použít. Pokud chcete použít nástroje .NET a sestavit kód, nastavte Sdk
atribut na jedno z ID v tabulce Dostupných sad SDK .
<Project Sdk="Microsoft.NET.Sdk">
<!-- Omitted for brevity... -->
</Project>
Atribut Project/Sdk
a Sdk
prvek umožňují doplňkové sady SDK. Podívejte se na následující příklad, ve kterém je sada .NET Aspire SDK (Aspire.AppHost.Sdk
) přidána do projektu na vrcholu Microsoft.NET.Sdk
:
<Project Sdk="Microsoft.NET.Sdk">
<Sdk Name="Aspire.AppHost.Sdk" Version="9.0.0" />
<!-- Omitted for brevity... -->
</Project>
V předchozím souboru projektu se obě sady SDK používají k řešení závislostí v doplňkové povaze. Další informace najdete v tématu .NET Aspire SDK.
Pokud chcete zadat sadu SDK, která pochází z NuGetu, zadejte verzi na konec názvu nebo zadejte název a verzi v souboru global.json .
<Project Sdk="MSBuild.Sdk.Extras/2.0.54">
...
</Project>
Další způsob, jak určit sadu SDK, je s elementem nejvyšší úrovně Sdk
:
<Project>
<Sdk Name="Microsoft.NET.Sdk" />
...
</Project>
Odkazování na sadu SDK jedním z těchto způsobů výrazně zjednodušuje soubory projektu pro .NET. Při vyhodnocování projektu přidá nástroj MSBuild implicitní importy pro Sdk.props
na začátku souboru projektu a Sdk.targets
na konci souboru.
<Project>
<!-- Implicit top import -->
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
...
<!-- Implicit bottom import -->
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>
Návod
Na počítači s Windows najdete soubory Sdk.props a Sdk.targets ve složce %ProgramFiles%\dotnet\sdk\[version]\Sdks\Microsoft.NET.Sdk\Sdk\Sdk .
Předběžné zpracování souboru projektu
Plně rozbalený projekt můžete vidět tak, jak ho vidí MSBuild, po zahrnutí sady SDK a jejích cílů, pomocí příkazu dotnet msbuild -preprocess
. Přepínač předzpracovánídotnet msbuild
příkazu ukazuje, které soubory se naimportují, jejich zdroje a jejich příspěvky do sestavení bez skutečného sestavení projektu.
Pokud má projekt více cílových architektur, zaměřte výsledky příkazu pouze na jednu architekturu tak, že ho zadáte jako vlastnost MSBuild. Příklad:
dotnet msbuild -property:TargetFramework=net8.0 -preprocess:output.xml
Výchozí zahrnutí a vyloučení
Výchozí nastavení zahrnuje a vylučuje položky Compile
položky, vložené prostředky a None
položky jsou definovány v sadě SDK. Na rozdíl od projektů .NET Framework bez sady SDK nemusíte tyto položky v souboru projektu zadávat, protože výchozí hodnoty pokrývají nejběžnější případy použití. Díky tomuto chování je soubor projektu menší a v případě potřeby srozumitelnější a snadněji upravitelný ručně.
Následující tabulka uvádí, které prvky a které globy jsou zahrnuté a vyloučené v sadě .NET SDK:
Prvek | Zahrnout glob | Vyloučení globu | Odstraňte glob |
---|---|---|---|
Compile | **/*.cs (nebo jiná jazyková rozšíření) | **/*.uživatel; **/*.*proj; **/*.sln(x); **/*.vssscc | Nevztahuje se |
EmbeddedResource | **/*.resx | **/*.uživatel; **/*.*proj; **/*.sln(x); **/*.vssscc | Nevztahuje se |
None | **/* | **/*.uživatel; **/*.*proj; **/*.sln(x); **/*.vssscc | **/*.Cs; **/*.resx |
Poznámka:
Složky ./bin
a ./obj
, které jsou reprezentovány vlastnostmi MSBuild $(BaseOutputPath)
a $(BaseIntermediateOutputPath)
, jsou ve výchozím nastavení vyloučeny z globů. Excludes jsou reprezentovány vlastností DefaultItemExcludes.
Sada .NET Desktop SDK obsahuje další zahrnutí a vyloučení pro WPF. Další informace najdete v tématu Výchozí nastavení WPF zahrnuje a vylučuje.
Pokud v souboru projektu explicitně definujete některou z těchto položek, pravděpodobně obdržíte chybu sestavení NETSDK1022. Informace o tom, jak chybu vyřešit, najdete v tématu NETSDK1022: Byly zahrnuty duplicitní položky.
Implicitní direktivy using
Počínaje rozhraním .NET 6 se implicitní global using
direktivy přidávají do nových projektů jazyka C#. To znamená, že můžete použít typy definované v těchto oborech názvů, aniž byste museli zadat jejich plně kvalifikovaný název nebo ručně přidat direktivu using
. Implicitní aspekt odkazuje na skutečnost, že global using
direktivy jsou přidány do vygenerovaného souboru v adresáři obj projektu.
Pro projekty, které používají jednu z následujících sad SDK, se přidávají implicitní global using
direktivy:
Microsoft.NET.Sdk
Microsoft.NET.Sdk.Web
Microsoft.NET.Sdk.Worker
Microsoft.NET.Sdk.WindowsDesktop
Pro každý obor názvů v sadě výchozích oborů názvů, která je založena na SDK projektu, se přidá direktiva. Tyto výchozí obory názvů jsou uvedeny v následující tabulce.
Sada pro vývoj softwaru (SDK) | Výchozí obory názvů |
---|---|
Microsoft.NET.Sdk | System System.Collections.Generic System.IO System.Linq System.Net.Http System.Threading System.Threading.Tasks |
Microsoft.NET.Sdk.Web | Obory názvů Microsoft.NET.Sdk System.Net.Http.Json Microsoft.AspNetCore.Builder Microsoft.AspNetCore.Hosting Microsoft.AspNetCore.Http Microsoft.AspNetCore.Routing Microsoft.Extensions.Configuration Microsoft.Extensions.DependencyInjection Microsoft.Extensions.Hosting Microsoft.Extensions.Logging |
Microsoft.NET.Sdk.Worker | Obory názvů Microsoft.NET.Sdk Microsoft.Extensions.Configuration Microsoft.Extensions.DependencyInjection Microsoft.Extensions.Hosting Microsoft.Extensions.Logging |
Microsoft.NET.Sdk.WindowsDesktop (Windows Forms) | Obory názvů Microsoft.NET.Sdk System.Drawing System.Windows.Forms |
Microsoft.NET.Sdk.WindowsDesktop (WPF) | Obory názvů Microsoft.NET.Sdk Odstraněno System.IO Odstraněno System.Net.Http |
Pokud chcete tuto funkci zakázat nebo pokud chcete povolit implicitní global using
direktivy v existujícím projektu jazyka ImplicitUsings
C#, můžete to provést prostřednictvím vlastnosti MSBuild.
Další implicitní global using
direktivy můžete zadat přidáním Using
položek (nebo Import
položek pro projekty jazyka Visual Basic) do souboru projektu, například:
<ItemGroup>
<Using Include="System.IO.Pipes" />
</ItemGroup>
Poznámka:
Počínaje sadou .NET 8 SDK, System.Net.Http již není zahrnuta v Microsoft.NET.Sdk
při cílení na .NET Framework.
Implicitní odkazy na balíčky
Když projekt cílí na .NET Standard 1.0-2.0, sada .NET SDK přidá implicitní odkazy na určité metabalíčky. Metabalíč je balíček založený na rozhraní, který se skládá pouze ze závislostí na jiných balíčcích. Metabalíčky se implicitně odkazují na základě cílových architektur zadaných ve vlastnosti TargetFramework nebo TargetFrameworks (množné číslo) vašeho souboru projektu.
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net462</TargetFrameworks>
</PropertyGroup>
V případě potřeby můžete implicitní odkazy na balíčky zakázat pomocí vlastnosti DisableImplicitFrameworkReferences a přidat explicitní odkazy pouze na architektury nebo balíčky, které potřebujete.
Doporučení:
- Při cílení na rozhraní .NET Framework nebo .NET Standard 1.0-2.0 nepřidávejte explicitní odkaz na
NETStandard.Library
metabalíky prostřednictvím<PackageReference>
položky v souboru projektu. U projektů .NET Standard 1.0-2.0 se na tyto metabalíčky implicitně odkazují. V případě projektů .NET Framework, pokud je při použití balíčku NuGet založeného na .NET Standard potřeba jakákoli verzeNETStandard.Library
, NuGet tuto verzi automaticky nainstaluje. - Pokud při cílení na .NET Standard 1.0-2.0 potřebujete konkrétní verzi
NETStandard.Library
metabalíku, můžete použít<NetStandardImplicitPackageVersion>
vlastnost a nastavit požadovanou verzi.
Události sestavení
V projektech ve stylu sady SDK použijte cíl nástroje MSBuild s názvem PreBuild
nebo PostBuild
a nastavte vlastnost BeforeTargets
pro PreBuild
nebo vlastnost AfterTargets
pro PostBuild
.
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command=""$(ProjectDir)PreBuildEvent.bat" "$(ProjectDir)..\" "$(ProjectDir)" "$(TargetDir)"" />
</Target>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="echo Output written to $(TargetDir)" />
</Target>
Poznámka:
- Pro cíle nástroje MSBuild můžete použít libovolný název. Integrované vývojové prostředí sady Visual Studio ale rozpozná cíle
PreBuild
aPostBuild
, takže pomocí těchto názvů můžete upravit příkazy v tomto prostředí. - Vlastnosti
PreBuildEvent
aPostBuildEvent
nejsou doporučené v projektech ve stylu sady SDK, protože makra, jako$(ProjectDir)
jsou například nejsou vyřešena. Například následující kód není podporován:
<PropertyGroup>
<PreBuildEvent>"$(ProjectDir)PreBuildEvent.bat" "$(ProjectDir)..\" "$(ProjectDir)" "$(TargetDir)"</PreBuildEvent>
</PropertyGroup>
Přizpůsobit sestavení
Sestavení můžete přizpůsobit různými způsoby. Vlastnost můžete přepsat tak, že ji předáte jako argument příkazu msbuild nebo příkazu dotnet. Vlastnost můžete také přidat do souboru projektu nebo do souboru Directory.Build.props. Seznam užitečných vlastností pro projekty .NET najdete v referenčních informacích k nástroji MSBuild pro projekty .NET SDK.
Návod
Snadný způsob, jak vytvořit nový soubor Directory.Build.props z příkazového řádku, je pomocí příkazu dotnet new buildprops
v kořenovém adresáři úložiště.
Vlastní cíle
Projekty .NET mohou zabalit vlastní cíle a vlastnosti nástroje MSBuild pro použití projekty, které balíček využívají. Tento typ rozšiřitelnosti použijte, pokud chcete:
- Rozšiřte proces sestavení.
- Získejte přístup k artefaktům procesu sestavení, jako jsou vygenerované soubory.
- Zkontrolujte konfiguraci, pod kterou se sestavení vyvolá.
Vlastní cíle sestavení nebo vlastnosti přidáte umístěním souborů do formuláře <package_id>.targets
nebo <package_id>.props
(například Contoso.Utility.UsefulStuff.targets
) do složky sestavení projektu.
Následující XML je výňatek ze souboru .csproj, který dává příkazu dotnet pack
pokyn, co se má zabalit. Element <ItemGroup Label="dotnet pack instructions">
umístí cílové soubory do složky sestavení uvnitř balíčku. Prvek <Target Name="CollectRuntimeOutputs" BeforeTargets="_GetPackageFiles">
umístí sestavení a .json soubory do složky sestavení .
<Project Sdk="Microsoft.NET.Sdk">
...
<ItemGroup Label="dotnet pack instructions">
<Content Include="build\*.targets">
<Pack>true</Pack>
<PackagePath>build\</PackagePath>
</Content>
</ItemGroup>
<Target Name="CollectRuntimeOutputs" BeforeTargets="_GetPackageFiles">
<!-- Collect these items inside a target that runs after build but before packaging. -->
<ItemGroup>
<Content Include="$(OutputPath)\*.dll;$(OutputPath)\*.json">
<Pack>true</Pack>
<PackagePath>build\</PackagePath>
</Content>
</ItemGroup>
</Target>
...
</Project>
Pro přidání vlastního cíle do projektu přidejte prvek PackageReference
, který odkazuje na balíček a jeho verzi. Na rozdíl od nástrojů je balíček vlastních cílů zahrnutý v rámci závislostí projektu, který ho využívá.
Můžete nakonfigurovat, jak používat přizpůsobený cíl. Vzhledem k tomu, že se jedná o úlohu MSBuild, může záviset na určené cílové úloze, spustit po jiné úloze nebo ji ručně spustit pomocí dotnet msbuild -t:<target-name>
příkazu. Pokud ale chcete zajistit lepší uživatelské prostředí, můžete kombinovat nástroje pro jednotlivé projekty a vlastní cíle. V tomto scénáři nástroj pro jednotlivé projekty přijímá potřebné parametry a překládá je do požadovaného dotnet msbuild
vyvolání, které spouští cíl. V rámci projektu si můžete prohlédnout ukázku tohoto druhu součinnosti na repozitáři vzorků dotnet-packer
.