Visual Studio derleme işlemini genişletme
Visual Studio derleme işlemi, proje dosyanıza aktarılan bir dizi MSBuild .targets dosyası tarafından tanımlanır. İçeri aktarılan bu dosyalardan biri olan Microsoft.Common.targets, derleme işleminin çeşitli noktalarında özel görevleri çalıştırmanıza olanak sağlayacak şekilde genişletilebilir. Bu makalede, Visual Studio derleme işlemini genişletmek için kullanabileceğiniz iki yöntem açıklanmaktadır:
Ortak hedeflerde tanımlanan belirli önceden tanımlanmış hedefleri geçersiz kılma (Microsoft.Common.targets veya içeri aktardığı dosyalar).
Ortak hedeflerde tanımlanan "DependsOn" özelliklerini geçersiz kılma.
Önceden tanımlanmış hedefleri geçersiz kılma
Ortak hedefler, derleme işlemindeki bazı önemli hedeflerden önce ve sonra çağrılan önceden tanımlanmış boş hedefler kümesini içerir. Örneğin, MSBuild ana hedef önce CoreBuild
hedef çağırır BeforeBuild
ve AfterBuild
hedef sonra CoreBuild
hedef. Varsayılan olarak, ortak hedeflerdeki boş hedefler hiçbir şey yapmaz, ancak ortak hedefleri içeri aktaran bir proje dosyasında istediğiniz hedefleri tanımlayarak varsayılan davranışlarını geçersiz kılabilirsiniz. Önceden tanımlanmış hedefleri geçersiz kılarak, derleme işlemi üzerinde daha fazla denetim sahibi olmanız için MSBuild görevlerini kullanabilirsiniz.
Dekont
SDK stilindeki projeler, proje dosyasının son satırından sonra hedefleri örtük olarak içeri aktarır. Bu, içeri aktarmalarınızı Nasıl yapılır: MSBuild proje SDK'larını kullanma başlığı altında açıklandığı gibi el ile belirtmediğiniz sürece varsayılan hedefleri geçersiz kılamayacağınız anlamına gelir.
Önceden tanımlanmış bir hedefi geçersiz kılmak için
Geçersiz kılmak istediğiniz ortak hedeflerde önceden tanımlanmış bir hedefi tanımlayın. Güvenli bir şekilde geçersiz kılabileceğiniz hedeflerin tam listesi için aşağıdaki tabloya bakın.
Proje dosyanızın sonunda, etiketin hemen önünde
</Project>
hedefi veya hedefleri tanımlayın. Örneğin:<Project> ... <Target Name="BeforeBuild"> <!-- Insert tasks to run before build here --> </Target> <Target Name="AfterBuild"> <!-- Insert tasks to run after build here --> </Target> </Project>
Proje dosyasını oluşturun.
Aşağıdaki tabloda, güvenli bir şekilde geçersiz kılabileceğiniz ortak hedeflerdeki tüm hedefler gösterilmektedir.
Hedef adı | Açıklama |
---|---|
BeforeCompile , AfterCompile |
Bu hedeflerden birine eklenen görevler çekirdek derlemesi yapılmadan önce veya sonra çalıştırılır. Özelleştirmelerin çoğu bu iki hedef arasında gerçekleştirilir. |
BeforeBuild , AfterBuild |
Bu hedeflerden birine eklenen görevler, derlemedeki diğer her şeyden önce veya sonra çalıştırılır. Not:BeforeBuild ve AfterBuild hedefleri çoğu proje dosyasının sonundaki açıklamalarda zaten tanımlanmıştır ve böylece proje dosyanıza derleme öncesi ve sonrası olayları kolayca ekleyebilirsiniz. |
BeforeRebuild , AfterRebuild |
Bu hedeflerden birine eklenen görevler, çekirdek yeniden oluşturma işlevi çağrılmadan önce veya sonra çalıştırılır. Microsoft.Common.targets'ta hedef yürütme sırası: BeforeRebuild , Clean , Build ve sonra AfterRebuild . |
BeforeClean , AfterClean |
Bu hedeflerden birine eklenen görevler, çekirdek temizleme işlevi çağrılmadan önce veya sonra çalıştırılır. |
BeforePublish , AfterPublish |
Bu hedeflerden birine eklenen görevler, çekirdek yayımlama işlevi çağrılmadan önce veya sonra çalıştırılır. |
BeforeResolveReferences , AfterResolveReferences |
Bu hedeflerden birine eklenen görevler, derleme başvuruları çözümlenmeden önce veya sonra çalıştırılır. |
BeforeResGen , AfterResGen |
Bu hedeflerden birine eklenen görevler, kaynaklar oluşturulmadan önce veya sonra çalıştırılır. |
Örnek: AfterTargets ve BeforeTargets
Aşağıdaki örnekte, çıkış dosyalarıyla AfterTargets
bir şey yapmayan özel bir hedef eklemek için özniteliğinin nasıl kullanılacağı gösterilmektedir. Bu durumda, çıkış dosyalarını yeni bir CustomOutput klasörüne kopyalar. Örnek ayrıca bir öznitelik kullanarak ve özel temizleme işleminin hedef öncesinde CoreClean
çalıştırılacağını belirterek özel derleme işlemi tarafından oluşturulan dosyaların hedefle CustomClean
BeforeTargets
nasıl temizleneceğini gösterir.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<_OutputCopyLocation>$(OutputPath)..\..\CustomOutput\</_OutputCopyLocation>
</PropertyGroup>
<Target Name="CustomAfterBuild" AfterTargets="Build">
<ItemGroup>
<_FilesToCopy Include="$(OutputPath)**\*"/>
</ItemGroup>
<Message Text="_FilesToCopy: @(_FilesToCopy)" Importance="high"/>
<Message Text="DestFiles:
@(_FilesToCopy->'$(_OutputCopyLocation)%(RecursiveDir)%(Filename)%(Extension)')"/>
<Copy SourceFiles="@(_FilesToCopy)"
DestinationFiles=
"@(_FilesToCopy->'$(_OutputCopyLocation)%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
<Target Name="CustomClean" BeforeTargets="CoreClean">
<Message Text="Inside Custom Clean" Importance="high"/>
<ItemGroup>
<_CustomFilesToDelete Include="$(_OutputCopyLocation)**\*"/>
</ItemGroup>
<Delete Files='@(_CustomFilesToDelete)'/>
</Target>
</Project>
Uyarı
Önceki bölümdeki tabloda listelenen önceden tanımlanmış hedeflerden farklı adlar kullandığınızdan emin olun (örneğin, özel derleme hedefini burada değil, AfterBuild
burada CustomAfterBuild
adlandırdık), çünkü önceden tanımlanmış hedefler bunları da tanımlayan SDK içeri aktarması tarafından geçersiz kılınır. Bu hedefleri geçersiz kılan hedef dosyanın içeri aktarıldığını görmezsiniz, ancak SDK'ya başvurmak için öznitelik yöntemini kullandığınızda bu dosya proje dosyasının Sdk
sonuna örtük olarak eklenir.
DependsOn özelliklerini geçersiz kılma
Önceden tanımlanmış hedefleri geçersiz kılma, derleme işlemini genişletmenin kolay bir yoludur, ancak MSBuild hedeflerin tanımını sırayla değerlendirdiğinden, projenizi içeri aktaran başka bir projenin zaten geçersiz kıldığınız hedefleri geçersiz kılmasını önlemenin bir yolu yoktur. Bu nedenle, örneğin, diğer tüm projeler içeri aktarıldıktan sonra proje dosyasında tanımlanan son AfterBuild
hedef, derleme sırasında kullanılan hedef olacaktır.
Ortak hedefler genelinde özniteliklerde kullanılan DependsOnTargets
DependsOn özelliklerini geçersiz kılarak hedeflerin istenmeyen geçersiz kılmalarına karşı koruma sağlayabilirsiniz. Örneğin, Build
hedef özniteliği DependsOnTargets
değerini "$(BuildDependsOn)"
içerir. Aşağıdakileri dikkate alın:
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>
Bu XML parçası, hedefin Build
çalıştırılabilmesi için önce özelliğinde belirtilen tüm hedeflerin BuildDependsOn
çalıştırılması gerektiğini belirtir. BuildDependsOn
özelliği şu şekilde tanımlanır:
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
Proje dosyanızın sonunda adlı BuildDependsOn
başka bir özellik bildirerek bu özellik değerini geçersiz kılabilirsiniz. Önceki BuildDependsOn
özelliği yeni özelliğe ekleyerek, hedef listenin başına ve sonuna yeni hedefler ekleyebilirsiniz. Örneğin:
<PropertyGroup>
<BuildDependsOn>
MyCustomTarget1;
$(BuildDependsOn);
MyCustomTarget2
</BuildDependsOn>
</PropertyGroup>
<Target Name="MyCustomTarget1">
<Message Text="Running MyCustomTarget1..."/>
</Target>
<Target Name="MyCustomTarget2">
<Message Text="Running MyCustomTarget2..."/>
</Target>
Proje dosyalarınızı içeri aktaran projeler, yaptığınız özelleştirmelerin üzerine yazmadan bu özellikleri geçersiz kılabilir.
DependsOn özelliğini geçersiz kılmak için
Geçersiz kılmak istediğiniz ortak hedeflerde önceden tanımlanmış bir DependsOn özelliğini belirleyin. Sık geçersiz kılınan DependsOn özelliklerinin listesi için aşağıdaki tabloya bakın.
Proje dosyanızın sonunda özelliğin veya özelliklerin başka bir örneğini tanımlayın. Özgün özelliğini ( örneğin
$(BuildDependsOn)
, ) yeni özelliğe ekleyin.Özellik tanımından önce veya sonra özel hedeflerinizi tanımlayın.
Proje dosyasını oluşturun.
Genellikle geçersiz kılınan DependsOn özellikleri
Özellik adı | Açıklama |
---|---|
BuildDependsOn |
Derleme işleminin tamamına özel hedefler eklemek istiyorsanız geçersiz kılınacak özellik. |
CleanDependsOn |
Özel derleme işleminizin çıkışını temizlemek istiyorsanız geçersiz kılınacak özellik. |
CompileDependsOn |
Derleme adımından önce veya sonra özel işlemler eklemek istiyorsanız geçersiz kılınacak özellik. |
Örnek: BuildDependsOn ve CleanDependsOn
Aşağıdaki örnek ve AfterTargets
örneğine BeforeTargets
benzer, ancak benzer işlevlerin nasıl elde edilemeye devam ettiği gösterilmektedir. Derlemeden sonra çıkış dosyalarını kopyalayan kendi görevinizi CustomAfterBuild
eklemek için kullanarak BuildDependsOn
derlemeyi genişletir ve ayrıca kullanarak CleanDependsOn
ilgili CustomClean
görevi ekler.
Bu örnekte bu, SDK stilinde bir projedir. Bu makalenin önceki bölümlerinde SDK stilindeki projeler hakkında notta belirtildiği gibi, Visual Studio'nun proje dosyaları oluştururken kullandığı öznitelik yerine Sdk
el ile içeri aktarma yöntemini kullanmanız gerekir.
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk"/>
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk"/>
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);CustomAfterBuild
</BuildDependsOn>
<CleanDependsOn>
$(CleanDependsOn);CustomClean
</CleanDependsOn>
<_OutputCopyLocation>$(OutputPath)..\..\CustomOutput\</_OutputCopyLocation>
</PropertyGroup>
<Target Name="CustomAfterBuild">
<ItemGroup>
<_FilesToCopy Include="$(OutputPath)**\*"/>
</ItemGroup>
<Message Importance="high" Text="_FilesToCopy: @(_FilesToCopy)"/>
<Message Text="DestFiles:
@(_FilesToCopy->'$(_OutputCopyLocation)%(RecursiveDir)%(Filename)%(Extension)')"/>
<Copy SourceFiles="@(_FilesToCopy)"
DestinationFiles="@(_FilesToCopy->'$(_OutputCopyLocation)%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
<Target Name="CustomClean">
<Message Importance="high" Text="Inside Custom Clean"/>
<ItemGroup>
<_CustomFilesToDelete Include="$(_OutputCopyLocation)**\*"/>
</ItemGroup>
<Delete Files="@(_CustomFilesToDelete)"/>
</Target>
</Project>
Öğelerin sırası önemlidir. BuildDependsOn
ve CleanDependsOn
öğeleri, standart SDK hedefleri dosyası içeri aktarıldıktan sonra görünmelidir.
İlgili içerik
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