Bagikan melalui


Mengonfigurasi target dan tugas

Tugas MSBuild yang dipilih dapat diatur untuk dijalankan di tempat yang ditargetkan, jika pengembangan komputer mendukung tempat target. Misalnya, ketika Anda menggunakan komputer Windows 64-bit untuk membangun aplikasi yang menargetkan rancangan konstruksi Windows 32-bit, tugas yang dipilih dijalankan dalam proses 32-bit.

Catatan

Jika tugas build ditulis dalam bahasa .NET, seperti Visual C# atau Visual Basic, dan tidak menggunakan sumber daya atau alat native, tugas tersebut akan berjalan dalam konteks target apa pun tanpa adaptasi.

Parameter tugas dan atribut UsingTask

Atribut berikut UsingTask memengaruhi semua operasi tugas dalam proses build tertentu:

  • AtributRuntime, jika ada, mengatur versi runtime bahasa umum (CLR), dan dapat mengambil salah satu nilai ini: CLR2, CLR4, CurrentRuntime, atau * (runtime apa pun).

  • AtributArchitecture, jika ada, mengatur platform dan bitness, dan dapat mengambil salah satu nilai ini: x86, x64, CurrentArchitecture, atau * (arsitektur apa pun).

  • Atribut TaskFactory, jika ada, mengatur pabrik tugas yang membuat dan menjalankan instans tugas, dan hanya mengambil nilai TaskHostFactory. Untuk informasi selengkapnya, lihat Pabrik tugas nanti di dokumen ini.

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

Anda juga dapat menggunakan parameter MSBuildRuntime dan MSBuildArchitecture untuk mengatur konteks target permintaan tugas individu.

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

Sebelum MSBuild menjalankan tugas, MSBuild mencari kecocokan UsingTask yang memiliki konteks target yang sama. Parameter yang ditentukan dalam UsingTask tetapi tidak dalam tugas yang sesuai dianggap cocok. Parameter yang ditentukan dalam tugas tetapi tidak dalam UsingTask yang sesuai juga dianggap cocok. Jika nilai parameter tidak ditentukan dalam UsingTask atau tugas, nilainya diatur secara default ke * (parameter apa pun).

Peringatan

Jika ada lebih dari satu UsingTask dan semuanya memiliki atribut , , Runtimedan Architecture yang TaskNamecocok, yang pertama dievaluasi akan menggantikan yang lain. Ini berbeda dari Property perilaku dan Target elemen.

Jika parameter diatur pada tugas, MSBuild mencoba menemukan UsingTask yang cocok dengan parameter ini atau, setidaknya tidak bertentangan. Lebih dari satu UsingTask dapat menentukan konteks target dari tugas yang sama. Misalnya, tugas yang memiliki executable yang berbeda untuk lingkungan target yang berbeda mungkin menyerupai tugas ini:

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

Mengesampingkan Default UsingTasks

Secara default, MSBuild menangani UsingTask sebagai "yang pertama menang." Mulai dari 17.2, MSBuild mendukung pengesampingan perilaku ini melalui Override parameter . UsingTask dengan parameter Override yang diatur ke true akan lebih diprioritaskan daripada UsingTask lainnya dari TaskName yang sama.

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

Peringatan

Ini hanya dapat dilakukan sekali per tugas. Build yang mencoba menambahkan beberapa pengambil alihan untuk tugas yang sama akan menerima kesalahan MSB4275MSBuild .

Pabrik tugas

Tabel berikut menunjukkan pabrik tugas yang disediakan oleh penginstalan MSBuild:

Pembuat tugas Deskripsi
AssemblyTaskFactory Ini adalah nilai default. Menjalankan tugas dalam proses.
TaskHostFactory Menjalankan tugas di luar proses.
RoslynCodeTaskFactory Untuk tugas sebaris yang ditulis dalam C# atau Visual Basic dan menargetkan .NET Standard; bekerja dengan dan msbuild.exe dotnet build.
CodeTaskFactory Untuk tugas sebaris yang ditulis dalam C# atau Visual Basic dan menargetkan .NET Framework; hanya berfungsi dengan msbuild.exe.

Mekanisme pabrik tugas dapat diperluas, sehingga Anda juga dapat menggunakan yang dibuat oleh pihak ketiga, atau membuat sendiri. Alasan untuk membuatnya adalah untuk mendukung bahasa lain untuk menulis tugas sebaris.

TaskHostFactory

Sebelum menjalankan tugas, MSBuild memeriksa untuk melihat apakah tugas tersebut ditunjuk untuk dijalankan dalam konteks perangkat lunak saat ini. Jika tugas begitu ditunjuk, MSBuild meneruskannya ke AssemblyTaskFactory, yang menjalankannya dalam proses saat ini; jika tidak, MSBuild meneruskan tugas ke TaskHostFactory, yang menjalankan tugas dalam proses yang cocok dengan konteks target. Bahkan jika konteks saat ini dan konteks target cocok, Anda dapat memaksa tugas untuk menjalankan di luar proses (untuk isolasi, keamanan, atau alasan lain) dengan mengatur TaskFactory ke TaskHostFactory.

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

Ketika TaskHostFactory ditentukan secara eksplisit, proses yang menjalankan tugas berumur pendek. Ini memungkinkan sistem operasi untuk membersihkan semua sumber daya yang terkait dengan tugas segera setelah dijalankan. Untuk alasan ini, tentukan saat mereferensikan TaskHostFactory tugas yang dibangun dalam proses build yang sama dengan penggunaannya, untuk menghindari kesalahan penggunaan file saat memperbarui perakitan tugas setelah build.

RoslynCodeTaskFactory

menyediakan RoslynCodeTaskFactory mekanisme di mana Anda dapat menulis kode C# atau Visual Basic untuk tugas dalam file proyek untuk digunakan segera. Kode dikompilasi selama proses build untuk menghasilkan tugas yang dapat Anda jalankan dalam build yang sama. Kode yang Anda tulis menargetkan .NET Standard, sehingga dapat digunakan saat menjalankan dotnet build, yang menggunakan MSBuild versi .NET Core (dan .NET 5 dan yang lebih baru), serta msbuild.exe, yang menggunakan .NET Framework. RoslynCodeTaskFactory adalah yang terbaik untuk penyesuaian yang agak terlalu sulit dilakukan dalam logika MSBuild, tetapi tidak cukup kompleks untuk membuat proyek terpisah. Lihat Membuat tugas sebaris MSBuild dengan RoslynCodeTaskFactory.

CodeTaskFactory

CodeTaskFactory adalah versi RoslynCodeTaskFactory lama yang terbatas pada MSBuild versi .NET Framework. Lihat Tugas sebaris MSBuild. Pabrik tugas ini didukung, tetapi kode yang lebih baru harus digunakan RoslynCodeTaskFactory untuk penerapan yang lebih luas.

Parameter tugas bayangan

Seperti parameter tugas lainnya, MSBuildRuntime dan MSBuildArchitecture dapat diatur dari properti build.

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

Tidak seperti parameter tugas lain, MSBuildRuntime dan MSBuildArchitecture tidak jelas untuk tugas itu sendiri. Untuk menulis tugas yang mengetahui konteks yang dijalankannya, Anda harus menguji konteks dengan memanggil .NET Framework, atau menggunakan properti build untuk meneruskan informasi konteks melalui parameter tugas lain.

Catatan

Atribut UsingTask dapat diatur dari properti toolset dan lingkungan.

Parameter MSBuildRuntime dan MSBuildArchitecture menyediakan cara paling fleksibel untuk mengatur konteks target, tetapi juga yang paling terbatas dalam cakupan. Di satu sisi, karena diatur pada instans tugas itu sendiri dan tidak dievaluasi sampai tugas akan berjalan, parameter tersebut dapat memperoleh nilainya dari cakupan penuh properti yang tersedia pada waktu evaluasi dan build. Di sisi lain, parameter ini hanya berlaku untuk instans tugas tertentu dalam target tertentu.

Catatan

Parameter tugas dievaluasi dalam konteks node induk, bukan dalam konteks host tugas. Variabel lingkungan yang bergantung pada runtime atau arsitektur (seperti lokasi File Program) akan mengevaluasi ke nilai yang cocok dengan node induk. Namun, jika variabel lingkungan yang sama dibaca langsung oleh tugas, variabel tersebut akan dievaluasi dengan benar dalam konteks host tugas.