.NET proje SDK'ları
.NET Core ve .NET 5 ve üzeri projeler bir yazılım geliştirme seti (SDK) ile ilişkilendirilir. Her proje SDK'sı , kod derleme, paketleme ve yayımlamadan sorumlu bir MSBuild hedefleri ve ilişkili görevler kümesidir. Proje SDK'sına başvuran bir proje bazen SDK stilinde bir proje olarak adlandırılır.
Kullanılabilir SDK'lar
Aşağıdaki SDK'lar kullanılabilir:
Kimlik | Açıklama | Depo |
---|---|---|
Microsoft.NET.Sdk |
.NET SDK | https://github.com/dotnet/sdk |
Microsoft.NET.Sdk.Web |
.NET Web SDK'sı | https://github.com/dotnet/sdk |
Microsoft.NET.Sdk.BlazorWebAssembly |
.NET Blazor WebAssembly SDK'sı | https://github.com/dotnet/aspnetcore |
Microsoft.NET.Sdk.Razor |
.NET Razor SDK'sı | https://github.com/dotnet/aspnetcore |
Microsoft.NET.Sdk.Worker |
.NET Çalışan Hizmeti SDK'sı | |
Microsoft.NET.Sdk.WindowsDesktop |
Windows Forms (WinForms) ve Windows Presentation Foundation (WPF) içeren .NET Masaüstü SDK'sı.* | https://github.com/dotnet/winforms ve https://github.com/dotnet/wpf |
.NET SDK, .NET için temel SDK'dır. Diğer SDK'lar .NET SDK'sına başvurur ve diğer SDK'larla ilişkilendirilmiş projeler tüm .NET SDK özelliklerine sahiptir. Örneğin Web SDK'sı hem .NET SDK'ya hem de Razor SDK'ya bağlıdır.
NuGet aracılığıyla dağıtabileceğiniz kendi SDK'nızı da yazabilirsiniz.
* .NET 5'den başlayarak, Windows Forms ve Windows Presentation Foundation (WPF) projeleri yerine Microsoft.NET.Sdk.WindowsDesktop
.NET SDK'sını (Microsoft.NET.Sdk
) belirtmelidir. Bu projeler için, ve UseWPF
veya UseWindowsForms
true
olarak ayarlanırsa TargetFramework
net5.0-windows
Windows masaüstü SDK'sı otomatik olarak içeri aktarılır. Projeniz .NET 5 veya üzerini hedefler ve SDK'yı Microsoft.NET.Sdk.WindowsDesktop
belirtirse, NETSDK1137 derleme uyarısı alırsınız.
Proje dosyaları
.NET projeleri MSBuild biçimini temel alır. C# projeleri için .csproj ve F# projeleri için .fsproj gibi uzantılara sahip proje dosyaları XML biçimindedir. MSBuild proje dosyasının kök öğesi Project öğesidir. öğesinin Project
, hangi SDK'nın (ve sürümün) kullanılacağını belirten isteğe bağlı Sdk
bir özniteliği vardır. .NET araçlarını kullanmak ve kodunuzu oluşturmak için özniteliğini Kullanılabilir SDK'lar tablosundaki kimliklerden birine ayarlayınSdk
.
<Project Sdk="Microsoft.NET.Sdk">
...
</Project>
NuGet'ten gelen bir SDK belirtmek için adın sonuna sürümü ekleyin veya global.json dosyasında adı ve sürümü belirtin.
<Project Sdk="MSBuild.Sdk.Extras/2.0.54">
...
</Project>
SDK'yi belirtmenin bir diğer yolu da üst düzey Sdk öğesidir:
<Project>
<Sdk Name="Microsoft.NET.Sdk" />
...
</Project>
Bir SDK'ya bu yollardan biriyle başvurmak.NET için proje dosyalarını büyük ölçüde basitleştirir. MSBuild, projeyi değerlendirirken proje dosyasının en üstüne ve Sdk.targets
en altına için Sdk.props
örtük içeri aktarmalar ekler.
<Project>
<!-- Implicit top import -->
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
...
<!-- Implicit bottom import -->
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>
İpucu
Bir Windows makinesinde Sdk.props ve Sdk.targets dosyaları %ProgramFiles%\dotnet\sdk\[version]\Sdks\Microsoft.NET.Sdk\Sdk klasöründe bulunabilir.
Proje dosyasını ön işleme
MSBuild, SDK ve hedefleri komutu kullanılarak dotnet msbuild -preprocess
eklendikten sonra tam olarak genişletilmiş projeyi görebilirsiniz. Komutun dotnet msbuild
önişlem anahtarı, projeyi oluşturmadan hangi dosyaların içeri aktarılacağını, kaynaklarını ve derlemeye katkılarını gösterir.
Projenin birden çok hedef çerçevesi varsa, komutu MSBuild özelliği olarak belirterek yalnızca bir çerçeveye odaklayın. Örneğin:
dotnet msbuild -property:TargetFramework=netcoreapp2.0 -preprocess:output.xml
Varsayılan eklemeler ve dışlamalar
Varsayılan olarak öğeler, ekli kaynaklar ve None
Compile
öğeler SDK'da tanımlanır. SDK olmayan .NET Framework projelerinden farklı olarak, varsayılanlar en yaygın kullanım örneklerini kapsadığından bu öğeleri proje dosyanızda belirtmeniz gerekmez. Bu davranış, proje dosyasını küçültür ve gerekirse el ile anlaşılmasını ve düzenlenmesini kolaylaştırır.
Aşağıdaki tabloda.NET SDK'sında hangi öğelerin ve hangi globların dahil ve dışlandığı gösterilmektedir:
Öğe | Glob ekle | Glob'ı dışla | Glob kaldırma |
---|---|---|---|
Compile | **/*.cs (veya diğer dil uzantıları) | **/*.Kullanıcı; **/*.*Proj; **/*.sln; **/*.vssscc | Yok |
EmbeddedResource | **/*.resx | **/*.Kullanıcı; **/*.*Proj; **/*.sln; **/*.vssscc | Yok |
None | **/* | **/*.Kullanıcı; **/*.*Proj; **/*.sln; **/*.vssscc | **/*.Cs; **/*.resx |
Not
./bin
ve MSBuild özellikleriyle $(BaseOutputPath)
temsil edilen ve ./obj
$(BaseIntermediateOutputPath)
klasörleri varsayılan olarak glob'ların dışında tutulur. Dışlamalar DefaultItemExcludes özelliğiyle temsil edilir.
.NET Masaüstü SDK'sı WPF için daha fazla içerir ve dışlar. Daha fazla bilgi için bkz. WPF varsayılan ekleme ve dışlamaları.
Derleme hataları
Proje dosyanızda bu öğelerden herhangi birini açıkça tanımlarsanız, büyük olasılıkla aşağıdakine benzer bir "NETSDK1022" derleme hatası alırsınız:
Yinelenen 'Compile' öğeleri dahil edildi. .NET SDK'sı varsayılan olarak proje dizininizdeki 'Compile' öğelerini içerir. Bu öğeleri proje dosyanızdan kaldırabilir veya proje dosyanıza açıkça eklemek istiyorsanız 'EnableDefaultCompileItems' özelliğini 'false' olarak ayarlayabilirsiniz.
Yinelenen 'EmbeddedResource' öğeleri dahil edildi. .NET SDK'sı varsayılan olarak proje dizininizdeki 'EmbeddedResource' öğelerini içerir. Bu öğeleri proje dosyanızdan kaldırabilir veya proje dosyanıza açıkça eklemek istiyorsanız 'EnableDefaultEmbeddedResourceItems' özelliğini 'false' olarak ayarlayabilirsiniz.
Hataları çözmek için aşağıdakilerden birini yapın:
Önceki tabloda listelenen örtük öğelerle eşleşen açık
Compile
,EmbeddedResource
veyaNone
öğelerini kaldırın.Tüm örtük dosya ekleme özelliğini devre dışı bırakmak için
false
EnableDefaultItems özelliğini olarak ayarlayın:<PropertyGroup> <EnableDefaultItems>false</EnableDefaultItems> </PropertyGroup>
Uygulamanızla yayımlanacak dosyaları belirtmek istiyorsanız, bunun için bilinen MSBuild mekanizmalarını (örneğin,
Content
öğesi) kullanmaya devam edebilirsiniz.EnableDefault Items, EnableDefault Items veya EnableDefaultNoneEmbeddedResourceItems özelliğini olarak ayarlayarak yalnızca
Compile
,EmbeddedResource
veya glob'larıfalse
seçmeli olarak devre dışı bırakın:None
Compile<PropertyGroup> <EnableDefaultCompileItems>false</EnableDefaultCompileItems> <EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems> <EnableDefaultNoneItems>false</EnableDefaultNoneItems> </PropertyGroup>
Yalnızca glob'ları devre dışı bırakırsanız
Compile
Visual Studio'daki Çözüm Gezgini yine de proje kapsamında *.cs öğeleri gösterir ve öğeler olarakNone
eklenir. ÖrtükNone
glob'ı devre dışı bırakmak içinfalse
de olarak ayarlayınEnableDefaultNoneItems
.
Örtük kullanım yönergeleri
.NET 6'dan başlayarak, örtük global using
yönergeler yeni C# projelerine eklenir. Bu, tam adlarını belirtmek veya el ile yönerge using
eklemek zorunda kalmadan bu ad alanları içinde tanımlanan türleri kullanabileceğiniz anlamına gelir. Örtük yönü, yönergelerin global using
projenin obj dizininde oluşturulan bir dosyaya eklenmesini ifade eder.
Aşağıdaki SDK'lardan birini kullanan projeler için örtük global using
yönergeler eklenir:
Microsoft.NET.Sdk
Microsoft.NET.Sdk.Web
Microsoft.NET.Sdk.Worker
Microsoft.NET.Sdk.WindowsDesktop
global using
Projenin SDK'sını temel alan bir dizi varsayılan ad alanına her ad alanı için bir yönerge eklenir. Bu varsayılan ad alanları aşağıdaki tabloda gösterilmiştir.
SDK | Varsayılan ad alanları |
---|---|
Microsoft.NET.Sdk | System System.Collections.Generic System.IO System.Linq System.Net.Http System.Threading System.Threading.Tasks |
Microsoft.NET.Sdk.Web | Microsoft.NET.Sdk ad alanları 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 | Microsoft.NET.Sdk ad alanları Microsoft.Extensions.Configuration Microsoft.Extensions.DependencyInjection Microsoft.Extensions.Hosting Microsoft.Extensions.Logging |
Microsoft.NET.Sdk.WindowsDesktop (Windows Forms) | Microsoft.NET.Sdk ad alanları System.Drawing System.Windows.Forms |
Microsoft.NET.Sdk.WindowsDesktop (WPF) | Microsoft.NET.Sdk ad alanları Kaldırıldı System.IO Kaldırıldı System.Net.Http |
Bu özelliği devre dışı bırakmak veya var olan bir C# projesinde örtük global using
yönergeleri etkinleştirmek istiyorsanız, bunu MSBuild özelliği aracılığıyla ImplicitUsings
yapabilirsiniz.
Proje dosyanıza öğe (veya Import
Visual Basic projeleri için öğeler) ekleyerek Using
ek örtük global using
yönergeler belirtebilirsiniz, örneğin:
<ItemGroup>
<Using Include="System.IO.Pipes" />
</ItemGroup>
Örtük paket başvuruları
.NET Core 1.0 - 2.2 veya .NET Standard 1.0 - 2.0 hedeflendiğinde, .NET SDK belirli meta paketlere örtük başvurular ekler. Meta paket oluşturma, yalnızca diğer paketlere bağımlılıklardan oluşan çerçeve tabanlı bir pakettir. Meta paketlere, proje dosyanızın TargetFramework veya TargetFrameworks özelliğinde belirtilen hedef çerçevelere göre örtük olarak başvurulur.
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFrameworks>netcoreapp2.1;net462</TargetFrameworks>
</PropertyGroup>
Gerekirse, DisableImplicitFrameworkReferences özelliğini kullanarak örtük paket başvurularını devre dışı bırakabilir ve yalnızca ihtiyacınız olan çerçevelere veya paketlere açık başvurular ekleyebilirsiniz.
Öneriler:
- .NET Framework, .NET Core 1.0 - 2.2 veya .NET Standard 1.0 - 2.0 hedeflenirken, proje dosyanızdaki bir öğe aracılığıyla veya
NETStandard.Library
meta paketlerineMicrosoft.NETCore.App
açık bir<PackageReference>
başvuru eklemeyin. .NET Core 1.0 - 2.2 ve .NET Standard 1.0 - 2.0 projeleri için bu meta paketlere örtük olarak başvurulur. .NET Framework projeleri için, .NET Standart tabanlı NuGet paketi kullanılırken herhangi bir sürümüNETStandard.Library
gerekiyorsa, NuGet bu sürümü otomatik olarak yükler. - .NET Core 1.0 - 2.2'yi hedeflerken çalışma zamanının belirli bir sürümüne ihtiyacınız varsa, meta paketine başvurmak yerine projenizdeki (örneğin,
1.0.4
) özelliğini kullanın<RuntimeFrameworkVersion>
. Örneğin, bağımsız dağıtımlar kullanıyorsanız 1.0.0 LTS çalışma zamanının belirli bir yama sürümüne ihtiyacınız olabilir. - .NET Standard 1.0 - 2.0'ı hedeflerken meta paketin belirli bir sürümüne
NETStandard.Library
ihtiyacınız varsa özelliğini kullanabilir<NetStandardImplicitPackageVersion>
ve ihtiyacınız olan sürümü ayarlayabilirsiniz.
Olayları derleme
SDK stili projelerde, veya adlı PreBuild
bir MSBuild hedefi kullanın ve veya için PostBuild
özelliğini PreBuild
AfterTargets
ayarlayınBeforeTargets
.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>
Not
- MSBuild hedefleri için herhangi bir ad kullanabilirsiniz. Ancak Visual Studio IDE
PreBuild
PostBuild
, bu adları kullanarak IDE'deki komutları düzenleyebilirsiniz. - gibi makrolar çözümlenmediğinden ve özellikleri
PreBuildEvent
PostBuildEvent
SDK stili projelerde$(ProjectDir)
önerilmez. Örneğin, aşağıdaki kod desteklenmez:
<PropertyGroup>
<PreBuildEvent>"$(ProjectDir)PreBuildEvent.bat" "$(ProjectDir)..\" "$(ProjectDir)" "$(TargetDir)"</PreBuildEvent>
</PropertyGroup>
Derlemeyi özelleştirme
Bir derlemeyi özelleştirmenin çeşitli yolları vardır. Bir özelliği bir msbuild veya dotnet komutuna bağımsız değişken olarak geçirerek geçersiz kılmak isteyebilirsiniz. Özelliğini proje dosyasına veya Directory.Build.props dosyasına da ekleyebilirsiniz. .NET projeleri için yararlı özelliklerin listesi için bkz . .NET SDK projeleri için MSBuild başvurusu.
İpucu
Komut satırından yeni bir Directory.Build.props dosyası oluşturmanın kolay bir yolu, deponuzun kökündeki komutu dotnet new buildprops
kullanmaktır.
Özel hedefler
.NET projeleri, paketi kullanan projeler tarafından kullanılmak üzere özel MSBuild hedeflerini ve özelliklerini paketleyebilir. Aşağıdaki işlemleri yapmak istediğinizde bu genişletilebilirlik türünü kullanın:
- Derleme işlemini genişletin.
- Oluşturulan dosyalar gibi derleme işleminin yapıtlarına erişin.
- Derlemenin çağrıldığı yapılandırmayı inceleyin.
Dosyaları forma <package_id>.targets
veya (örneğin, Contoso.Utility.UsefulStuff.targets
) projenin derleme klasörüne yerleştirerek özel derleme hedefleri veya <package_id>.props
özellikleri eklersiniz.
Aşağıdaki XML, komutuna paketlenmesi gerekenleri belirten bir .csproj dosyasından bir dotnet pack
kod parçacığıdır. <ItemGroup Label="dotnet pack instructions">
öğesi, hedef dosyalarını paketin içindeki derleme klasörüne yerleştirir. <Target Name="CollectRuntimeOutputs" BeforeTargets="_GetPackageFiles">
öğesi derlemeleri ve .json dosyalarını derleme klasörüne yerleştirir.
<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>
Projenizde özel bir hedef kullanmak için pakete ve sürümüne işaret eden bir PackageReference
öğe ekleyin. Araçlardan farklı olarak, özel hedefler paketi, tüketen projenin bağımlılık kapanışında yer alır.
Özel hedefin nasıl kullanılacağını yapılandırabilirsiniz. Bu bir MSBuild hedefi olduğundan, belirli bir hedefe bağımlı olabilir, başka bir hedef sonrasında çalışabilir veya komutu kullanılarak dotnet msbuild -t:<target-name>
el ile çağrılabilir. Ancak, daha iyi bir kullanıcı deneyimi sağlamak için proje başına araçları ve özel hedefleri birleştirebilirsiniz. Bu senaryoda, proje başına araç gereken parametreleri kabul eder ve bunu hedefi yürüten gerekli dotnet msbuild
çağrıya çevirir. Projedeki MVP Summit 2016 Hackathon samples deposunda bu tür bir sinerji örneği dotnet-packer
görebilirsiniz.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin