Aracılığıyla paylaş


Hedefleri ve görevleri yapılandırma

Seçilen MSBuild görevleri, geliştirme bilgisayarı hedef ortamı desteklediğinde hedefledikleri ortamda çalışacak şekilde ayarlanabilir. Örneğin, 32 bit Windows mimarisini hedefleyen bir uygulama oluşturmak için 64 bit Windows bilgisayar kullandığınızda, seçili görevler 32 bit işlemde çalıştırılır.

Not

Derleme görevi Visual C# veya Visual Basic gibi bir .NET dilinde yazılmışsa ve yerel kaynakları veya araçları kullanmıyorsa, uyarlama olmadan herhangi bir hedef bağlamda çalışır.

UsingTask öznitelikleri ve görev parametreleri

Aşağıdaki UsingTask öznitelikler, belirli bir derleme işlemindeki bir görevin tüm işlemlerini etkiler:

  • Runtime Özniteliği varsa, ortak dil çalışma zamanı (CLR) sürümünü ayarlar ve şu değerlerden herhangi birini alabilir: CLR2, CLR4, CurrentRuntimeveya * (herhangi bir çalışma zamanı).

  • Architecture Özniteliği varsa, platformu ve bitliği ayarlar ve şu değerlerden herhangi birini alabilir: x86, x64, CurrentArchitectureveya * (herhangi bir mimari).

  • TaskFactory özniteliği varsa, görev örneğini oluşturan ve çalıştıran görev fabrikasını ayarlar ve yalnızca değerini TaskHostFactoryalır. Daha fazla bilgi için bu belgenin devamında yer alan Görev fabrikaları bölümüne bakın.

<UsingTask TaskName="SimpleTask"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v3.5.dll" />

Tek bir görev çağrısının MSBuildRuntime hedef bağlamını ayarlamak için ve MSBuildArchitecture parametrelerini de kullanabilirsiniz.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

MSBuild bir görevi çalıştırmadan önce, aynı hedef bağlama sahip bir eşleştirme UsingTask arar. içinde belirtilen UsingTask ancak karşılık gelen görevde olmayan parametreler eşleştirilmiş olarak kabul edilir. Görevde belirtilen ancak karşılık gelen UsingTask parametrelerle eşleşmediği de kabul edilir. Veya görevinde parametre değerleri belirtilmezse UsingTask , değerler varsayılan olarak * (herhangi bir parametre) olur.

Uyarı

Birden UsingTask fazla varsa ve tümü eşleşen TaskName, Runtimeve Architecture özniteliklerine sahipse, değerlendirilecek ilk değer diğerlerinin yerini alır. Bu, ve Target öğelerinin Property davranışından farklıdır.

Görevde parametreler ayarlanırsa, MSBuild bu parametrelerle eşleşen veya en azından bunlarla çakışmayan bir UsingTask bulmaya çalışır. Aynı görevin hedef bağlamını birden UsingTask fazla belirtebilirsiniz. Örneğin, farklı hedef ortamlar için farklı yürütülebilir dosyaları olan bir görev şuna benzeyebilir:

<UsingTask TaskName="MyTool"
    Runtime="CLR2"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.v2.0.dll" />

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="MyTarget">
        <MyTool MSBuildRuntime="CLR2" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

Varsayılan UsingTasks geçersiz kılma

VARSAYıLAN olarak, MSBuild UsingTask'i "ilk kazanan" olarak işler. 17.2'den başlayarak, MSBuild parametresi aracılığıyla bu davranışı geçersiz kılmayı Override destekler. parametresi Override ayarlanmış true bir UsingTask, aynı TaskName'in diğer UsingTask'lerinden önceliklidir.

<UsingTask TaskName="MyTool"
    Runtime="CLR4"
    Architecture="x86"
    Override="true"
    AssemblyFile="$(MyToolsPath)\MyTool.4.0.dll" />

Uyarı

Bu işlem görev başına yalnızca bir kez yapılabilir. Aynı görev için birden çok geçersiz kılma eklemeye çalışan derlemeler MSBuild hatası MSB4275alır.

Görev fabrikaları

Aşağıdaki tabloda MSBuild yüklemesi tarafından sağlanan görev fabrikaları gösterilmektedir:

Görev fabrikası Açıklama
AssemblyTaskFactory Bu varsayılan değerdir. Görevi devam eden bir şekilde çalıştırır.
TaskHostFactory Görevi işlem dışı çalıştırır.
RoslynCodeTaskFactory C# veya Visual Basic ile yazılan ve .NET Standard'ı hedefleyen satır içi görevler için; hem hem dotnet buildde msbuild.exe ile çalışır.
CodeTaskFactory C# veya Visual Basic'te yazılan ve .NET Framework'e yönelik satır içi görevler için; yalnızca ile msbuild.exeçalışır.

Görev fabrikası mekanizması genişletilebilir olduğundan, üçüncü taraflar tarafından oluşturulanları da kullanabilir veya kendi mekanizmanızı oluşturabilirsiniz. Satır içi görevler yazmak için başka bir dili desteklemek, oluşturmanın bir nedeni olabilir.

TaskHostFactory

Bir görevi çalıştırmadan önce MSBuild, görevin geçerli yazılım bağlamında çalıştırılacak şekilde atanıp atanmadığını denetler. Görev bu kadar belirlenmişse, MSBuild bunu AssemblyTaskFactorygeçerli işlemde çalıştıran öğesine geçirir; aksi takdirde, MSBuild görevi TaskHostFactoryhedef bağlamla eşleşen bir işlemde çalıştıran öğesine geçirir. Geçerli bağlam ve hedef bağlam eşleşse bile, olarak ayarlayarak TaskFactory bir görevi işlem dışı (yalıtım, güvenlik veya diğer nedenlerle) çalıştırmaya TaskHostFactoryzorlayabilirsiniz.

<UsingTask TaskName="MisbehavingTask"
    TaskFactory="TaskHostFactory"
    AssemblyFile="$(MSBuildToolsPath)\MyTasks.dll">
</UsingTask>

TaskHostFactory Açıkça belirtildiğinde, görevi çalıştıran işlem kısa ömürlüdür. Bu, işletim sisteminin yürütüldikten hemen sonra görevle ilgili tüm kaynakları temizlemesine olanak tanır. Bu nedenle, bir derlemeden sonra görev derlemesini güncelleştirirken kullanılan dosya içi hatalardan kaçınmak için, kullanımlarıyla aynı derleme işleminde yerleşik görevlere başvururken belirtin TaskHostFactory .

RoslynCodeTaskFactory

, RoslynCodeTaskFactory proje dosyasındaki bir görev için hemen kullanmak üzere C# veya Visual Basic kodu yazabileceğiniz bir mekanizma sağlar. Kod, aynı derlemede yürütebileceğiniz bir görev oluşturmak için derleme işlemi sırasında derlenmiştir. Yazdığınız kod .NET Standard'ı hedeflediğinden dotnet build, MSBuild'in .NET Core (ve .NET 5 ve üzeri) sürümünün yanı sıra msbuild.exe.NET Framework kullanan sürümünü de kullanır. RoslynCodeTaskFactory MSBuild mantığında yapılması biraz zor olan ancak ayrı bir proje oluşturacak kadar karmaşık olmayan özelleştirmeler için en iyisidir. Bkz . RoslynCodeTaskFactory ile BIR MSBuild satır içi görevi oluşturma.

Codetaskfactory

CodeTaskFactory , MSBuild'in RoslynCodeTaskFactory .NET Framework sürümüyle sınırlı olan eski bir sürümüdür. Bkz . MSBuild satır içi görevleri. Bu görev fabrikası desteklenir, ancak daha geniş uygulanabilirlik için daha yeni kod kullanılmalıdır RoslynCodeTaskFactory .

Hayalet görev parametreleri

Diğer tüm görev parametreleri MSBuildRuntime gibi ve MSBuildArchitecture derleme özelliklerinden ayarlanabilir.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <FrameworkVersion>3.0</FrameworkVersion>
    </PropertyGroup>
    <Target Name="MyTarget">
        <SimpleTask MSBuildRuntime="$(FrameworkVerion)" MSBuildArchitecture= "x86"/>
    </Target>
</Project>

Diğer görev parametrelerinin MSBuildRuntime aksine ve MSBuildArchitecture görevin kendisi için belirgin değildir. Çalıştığı bağlamı tanıyan bir görev yazmak için bağlamı .NET Framework'e çağırarak test etmeniz veya diğer görev parametreleri aracılığıyla bağlam bilgilerini geçirmek için derleme özelliklerini kullanmanız gerekir.

Not

UsingTask öznitelikleri araç kümesinden ve ortam özelliklerinden ayarlanabilir.

MSBuildRuntime ve MSBuildArchitecture parametreleri, hedef bağlamı ayarlamak için en esnek yolu sağlar, ancak kapsamı en sınırlı olan yolu da sağlar. Bir yandan, görev örneğinde ayarlandığı ve görev çalışmak üzere olana kadar değerlendirilmedikleri için, değerlerini hem değerlendirme zamanında hem de derleme zamanında kullanılabilen özelliklerin tam kapsamından türetebilirler. Öte yandan, bu parametreler yalnızca belirli bir hedefteki görevin belirli bir örneğine uygulanır.

Not

Görev parametreleri, görev konağı bağlamında değil üst düğüm bağlamında değerlendirilir. Çalışma zamanına veya mimariye bağımlı ortam değişkenleri (Program Dosyaları konumu gibi) üst düğümle eşleşen değeri değerlendirir. Ancak, aynı ortam değişkeni doğrudan görev tarafından okunursa, görev konağı bağlamında doğru şekilde değerlendirilir.