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:
Atribut
Runtime
, jika ada, mengatur versi runtime bahasa umum (CLR), dan dapat mengambil salah satu nilai ini:CLR2
,CLR4
,CurrentRuntime
, atau*
(runtime apa pun).Atribut
Architecture
, 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 nilaiTaskHostFactory
. 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 , , Runtime
dan Architecture
yang TaskName
cocok, 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 MSB4275
MSBuild .
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.