Bagikan melalui


Membangun secara bertahap

Saat Anda membangun proyek besar, penting bahwa komponen yang dibuat sebelumnya yang masih terbaru tidak dibuat kembali. Jika semua target dibuat setiap saat, setiap build akan membutuhkan waktu lama untuk diselesaikan. Untuk mengaktifkan build bertambah bertahap (build yang mana hanya target yang belum dibuat sebelumnya atau target yang sudah kedaluwarsa, dibuat kembali), Microsoft Build Engine (MSBuild) dapat membandingkan tanda waktu file input dengan tanda waktu file output dan menentukan apakah akan melewati, membangun, atau membangun kembali sebagian target. Namun, harus ada pemetaan satu-ke-satu antara input dan output. Anda dapat menggunakan transformasi untuk memungkinkan target mengidentifikasi pemetaan langsung ini. Untuk mengetahui informasi selengkapnya tentang transformasi, lihat Transformasi.

Menentukan input dan output

Target dapat dibangun secara bertahap jika input dan output ditentukan dalam file proyek.

Untuk menentukan input dan output untuk target

  • Gunakan atribut Inputs dan Outputs elemen Target. Contohnya:

    <Target Name="Build"
        Inputs="@(CSFile)"
        Outputs="hello.exe">
    

MSBuild dapat membandingkan tanda waktu file input dengan tanda waktu file output dan menentukan apakah akan melewati, membangun, atau membangun kembali sebagian target. Dalam contoh berikut, jika ada file dalam daftar item @(CSFile) yang lebih baru dari file hello.exe, MSBuild akan menjalankan target; jika tidak, file tersebut akan dilewati:

<Target Name="Build"
    Inputs="@(CSFile)"
    Outputs="hello.exe">

    <Csc
        Sources="@(CSFile)"
        OutputAssembly="hello.exe"/>
</Target>

Saat input dan output ditentukan dalam target, setiap output hanya dapat memetakan ke satu input atau tidak mungkin ada pemetaan langsung antara output dan input. Dalam tugas Csc sebelumnya, misalnya, output, hello.exe, tidak dapat dipetakan ke input tunggal apa pun - ini tergantung pada semuanya.

Catatan

Target yang mana tidak ada pemetaan langsung antara input dan output akan selalu membangun lebih sering daripada target yang mana setiap output hanya dapat memetakan ke satu input karena MSBuild tidak dapat menentukan output mana yang perlu dibangun kembali jika beberapa input telah berubah.

Tugas yang mana Anda dapat mengidentifikasi pemetaan langsung antara output dan input, seperti tugas LC, paling cocok untuk build bertambah bertahap, tidak seperti tugas seperti Csc dan Vbc, yang menghasilkan satu perakitan output dari sejumlah input.

Contoh

Contoh berikut menggunakan proyek yang membangun file Bantuan untuk sistem Bantuan hipotetis. Proyek ini bekerja dengan mengonversi file .txt sumber menjadi file .content perantara, yang kemudian dikombinasikan dengan file metadata XML untuk menghasilkan file .help akhir yang digunakan oleh sistem Bantuan. Proyek ini menggunakan tugas hipotetis berikut:

  • GenerateContentFiles: Mengonversi file .txt menjadi file .content.

  • BuildHelp: Menggabungkan file .content dan file metadata XML untuk membangun file .help akhir.

Proyek ini menggunakan transformasi untuk membuat pemetaan satu-ke-satu antara input dan output dalam tugas GenerateContentFiles. Untuk mengetahui informasi selengkapnya, lihat Transformasi. Selain itu, elemen Output diatur untuk secara otomatis menggunakan output dari tugas GenerateContentFiles sebagai input untuk tugas BuildHelp.

File proyek ini berisi target Convert dan Build. Tugas GenerateContentFiles dan BuildHelp ditempatkan di target Convert dan Build masing-masing sehingga setiap target dapat dibangun secara bertahap. Dengan menggunakan elemen Output, output tugas GenerateContentFiles ditempatkan dalam daftar itemContentFile, tempat tugas dapat digunakan sebagai input untuk tugas BuildHelp. Menggunakan elemen Output dengan cara ini otomatis menyediakan output dari satu tugas sebagai input untuk tugas lain sehingga Anda tidak perlu mencantumkan item atau daftar item individual secara manual di setiap tugas.

Catatan

Meskipun target Convert dapat dibangun secara bertahap, semua output dari target tersebut selalu diperlukan sebagai input untuk target Build. MSBuild otomatis menyediakan semua output dari satu target sebagai input untuk target lain saat Anda menggunakan elemen Output.

<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

    <ItemGroup>
        <TXTFile Include="*.txt"/>
        <XMLFiles Include="\metadata\*.xml"/>
    </ItemGroup>

    <Target Name = "Convert"
        Inputs="@(TXTFile)"
        Outputs="@(TXTFile->'%(Filename).content')">

        <GenerateContentFiles
            Sources = "@(TXTFile)">
            <Output TaskParameter = "OutputContentFiles"
                ItemName = "ContentFiles"/>
        </GenerateContentFiles>
    </Target>

    <Target Name = "Build" DependsOnTargets = "Convert"
        Inputs="@(ContentFiles);@(XMLFiles)"
        Outputs="$(MSBuildProjectName).help">

        <BuildHelp
            ContentFiles = "@(ContentFiles)"
            MetadataFiles = "@(XMLFiles)"
            OutputFileName = "$(MSBuildProjectName).help"/>
    </Target>
</Project>