Share via


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

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

  2. 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>
    
  3. 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, Buildve 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 CustomCleanBeforeTargets 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, AfterBuildburada CustomAfterBuildadlandı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

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

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

  3. Özellik tanımından önce veya sonra özel hedeflerinizi tanımlayın.

  4. 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 CleanDependsOnilgili 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-&gt;'$(_OutputCopyLocation)%(RecursiveDir)%(Filename)%(Extension)')"/>

    <Copy SourceFiles="@(_FilesToCopy)"
          DestinationFiles="@(_FilesToCopy-&gt;'$(_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.