Build bertambah bertahap
Build bertambah bertahap adalah build yang dioptimalkan sehingga target yang memiliki file output yang terbaru sehubungan dengan file input terkaitnya 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 1-ke-1 antara nilai-nilai atribut ini. Jika pemetaan 1-ke-1 ada, MSBuild membandingkan stempel waktu setiap item input dengan stempel waktu item output yang sesuai. File output yang tidak memiliki pemetaan 1-ke-1 dibandingkan dengan semua file input. Item dianggap terbaru jika file outputnya memiliki usia yang sama atau lebih baru dari file atau file inputnya.
Catatan
Ketika MSBuild mengevaluasi file input, hanya konten daftar dalam eksekusi saat ini yang dipertimbangkan. Perubahan daftar dari build terakhir tidak otomatis membuat target kadaluarsa.
Jika semua item output sudah diperbarui, MSBuild melewati target. Build bertambah bertahap target ini dapat meningkatkan performa build secara signifikan. Jika hanya beberapa file yang terbaru, MSBuild menjalankan target tetapi melewatkan item terbaru, dan dengan demikian membawa semua item terbaru. Proses ini dikenal sebagai build bertambah bertahap parsial.
Pemetaan 1-ke-1 hanya dapat diproduksi dengan menjadikan Outputs
atribut sebagai transformasi Inputs
atribut. Untuk mengetahui informasi selengkapnya, lihat Transformasi.
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 jenis 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 diubah setelah target Pencadangan dijalankan, maka target Cadangan akan dilewati di build berikutnya.
Inferensi output
MSBuild membandingkan atribut Inputs
dan Outputs
dari target untuk menentukan apakah target harus dijalankan. Idealnya, kumpulan file yang ada setelah build bertambah bertahap 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
Condition
yang bernilaifalse
. Dalam hal ini, target tidak dijalankan, dan tidak berpengaruh pada build.Target memiliki output yang kadaluarsa dan dijalankan untuk memperbaruinya.
Target tidak memiliki output yang kedaluwarsa dan dilewati. MSBuild mengevaluasi target dan membuat perubahan pada item dan properti seolah-olah target telah dijalankan.
Untuk mendukung kompilasi bertambah bertahap, tugas harus memastikan bahwa nilai atribut TaskParameter
dari setiap elemen Output
sama dengan parameter input tugas. Berikut adalah beberapa contoh:
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
Kode ini membuat properti Easy, yang memiliki nilai "123" baik target dijalankan atau dilewati atau tidak.
Mulai di MSBuild 3.5, inferensi output dilakukan secara otomatis pada grup item dan properti dalam target. Tugas CreateItem
tidak diperlukan dalam target dan harus dihindari. Selain itu, tugas CreateProperty
harus digunakan dalam target hanya untuk menentukan apakah target telah dijalankan.
Sebelum MSBuild 3.5, Anda dapat menggunakan tugas CreateItem.
Menentukan apakah target telah dijalankan
Karena inferensi output, Anda harus menambahkan tugas CreateProperty
ke target untuk memeriksa properti dan item sehingga Anda dapat menentukan apakah target telah dijalankan. Tambahkan tugas CreateProperty
ke target dan berikan elemen Output
yang TaskParameter
-nya adalah "ValueSetByTask".
<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.