Bagikan melalui


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 bernilai false. 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.