Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Build inkremental MSBuild adalah build yang dioptimalkan sehingga target yang memiliki file output yang up-to-date sehubungan dengan file input yang sesuai tidak dijalankan.
Elemen target dapat memiliki atribut Inputs, yang menunjukkan item apa yang diharapkan target sebagai input, dan atribut Outputs, yang menunjukkan item apa yang dihasilkannya sebagai output. MSBuild mencoba menemukan pemetaan satu-ke-satu antara nilai atribut ini. Jika pemetaan seperti itu ada, MSBuild membandingkan stempel waktu setiap item input dengan stempel waktu item output yang sesuai. File output yang tidak memiliki pemetaan satu-ke-satu dibandingkan dengan semua file input. Item dianggap up-to-date jika file outputnya berusia sama atau lebih baru dari file atau file inputnya.
Nota
Ketika MSBuild mengevaluasi file input, hanya konten daftar dalam eksekusi saat ini yang dipertimbangkan. Perubahan dalam daftar dari build terakhir tidak secara otomatis membuat target kedaluarsa.
Jika semua item output up-to-date, MSBuild melewati target. Pembentukan inkremental dari target ini dapat meningkatkan kecepatan pembangunan secara signifikan. Jika hanya beberapa file yang up-to-date, MSBuild menjalankan target tetapi melewati item up-to-date, dan karenanya membawa semua item up-to-date. Proses ini dikenal sebagai build inkremental parsial.
Pemetaan satu-ke-satu hanya dapat diproduksi dengan membuat atribut Outputs sebagai transformasi atribut Inputs. Untuk informasi lebih lanjut, lihat transformasi MSBuild.
Pertimbangkan target berikut:
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
Kumpulan file yang diwakili oleh tipe item Compile disalin ke direktori cadangan. File cadangan memiliki ekstensi nama file .bak. Jika file yang diwakili oleh jenis item Compile, atau file cadangan yang sesuai, tidak dihapus atau dimodifikasi setelah target Backup dijalankan, target Backup dilewati dalam build berikutnya.
Inferensi output
MSBuild membandingkan atribut Inputs dan Outputs target untuk menentukan apakah target perlu dijalankan. Idealnya, kumpulan file yang ada setelah build inkremental selesai harus tetap sama apakah target terkait dijalankan atau tidak. Karena properti dan item yang dibuat atau diubah oleh tugas dapat memengaruhi build, MSBuild harus menyimpulkan nilainya meskipun target yang memengaruhinya dilewati. Proses ini dikenal sebagai inferensi output .
Ada tiga kasus:
Target memiliki atribut
Conditionyang bernilaifalse. Dalam hal ini, target tidak dijalankan dan tidak mempengaruhi hasil build.Target memiliki output kedaluarsa dan dijalankan untuk membawanya up-to-date.
Target tidak memiliki output kedaluarsa dan dilewati. MSBuild mengevaluasi target dan membuat perubahan pada item dan properti seolah-olah target berjalan.
Untuk mendukung kompilasi inkremental, tugas harus memastikan bahwa nilai atribut TaskParameter dari elemen Output sama dengan parameter input tugas. Misalnya:
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
Kode ini membuat properti Easy, yang memiliki nilai 123 apakah target dijalankan atau dilewati atau tidak.
Mulai dari MSBuild 3.5, inferensi output dilakukan secara otomatis pada grup item dan properti dalam target.
CreateItem tugas tidak diperlukan dalam target dan harus dihindari. Selain itu, tugas CreateProperty harus digunakan dalam target hanya untuk menentukan apakah target dijalankan.
Sebelum MSBuild 3.5, Anda dapat menggunakan tugas CreateItem.
Menentukan apakah target dijalankan
Karena inferensi output, Anda harus memeriksa properti dan item target untuk menentukan apakah target dijalankan. Untuk melakukannya, tambahkan tugas CreateProperty ke target dan berikan elemen Output yang TaskParameter nya ValueSetByTask. Misalnya:
<CreateProperty Value="true">
<Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>
Kode ini membuat properti CompileRan dan memberinya nilai true, tetapi hanya jika target dijalankan. Jika target dilewati, CompileRan tidak dibuat.