Bagikan melalui


Transformasi MSBuild

Transformasi adalah konversi satu-ke-satu dari satu daftar item ke daftar item lainnya. Selain mengaktifkan proyek untuk mengonversi daftar item, transformasi memungkinkan target untuk mengidentifikasi pemetaan langsung antara input dan outputnya. Topik ini menjelaskan transformasi dan bagaimana MSBuild menggunakannya untuk membangun proyek secara lebih efisien.

Mengubah pengubah

Transformasi sifatnya tidak berubah-ubah, tetapi dibatasi oleh sintaks khusus di mana semua pengubah transformasi harus dalam format %(<ItemMetaDataName>). Metadata item apa pun dapat digunakan sebagai pengubah transformasi. Pengubah ini termasuk metadata item terkenal yang ditetapkan ke setiap item saat dibuat. Untuk daftar metadata item terkenal, lihat Metadata item terkenal.

Dalam contoh berikut, daftar file .resx diubah menjadi daftar file .resources. Pengubah transformasi %(filename) menentukan bahwa setiap file .resources memiliki nama file yang sama dengan file .resx yang sesuai.

@(RESXFile->'%(filename).resources')

Misalnya, jika item dalam daftar item @(RESXFile) adalah Form1.resx, Form2.resx, dan Form3.resx, output dalam daftar yang ditransformasi akan menjadi Form1.resources, Form2.resources, dan Form3.resources.

Catatan

Anda dapat menentukan pemisah kustom untuk daftar item yang ditransformasi dengan cara yang sama seperti Anda menentukan pemisah untuk daftar item standar. Misalnya, untuk memisahkan daftar item yang ditransformasi dengan menggunakan koma (,) alih-alih titik koma default (;), gunakan XML berikut: @(RESXFile->'Toolset\%(filename)%(extension)', ',')

Menggunakan beberapa pengubah

Ekspresi transformasi dapat berisi beberapa pengubah, yang dapat digabungkan dalam urutan apa pun dan dapat diulang. Dalam contoh berikut, nama direktori yang berisi file diubah tetapi file mempertahankan nama asli dan ekstensi nama file.

@(RESXFile->'Toolset\%(filename)%(extension)')

Misalnya, jika item yang terkandung dalam RESXFile daftar item adalah Project1\Form1.resx, Project1\Form2.resx, dan Project1\Form3.text, output dalam daftar yang diubah akan menjadi Toolset\Form1.resx, Toolset\Form2.resx, dan Toolset\Form3.text.

Analisis dependensi

Transformasi menjamin pemetaan satu-ke-satu antara daftar item yang diubah dan daftar item asli. Oleh karena itu, jika target membuat output yang merupakan transformasi input, MSBuild dapat menganalisis tanda waktu input dan output, dan memutuskan apakah akan melewati, membangun, atau membangun kembali sebagian target.

Dalam tugas Salin dalam contoh berikut, setiap file dalam daftar item BuiltAssemblies memetakan ke file di folder tujuan tugas, yang ditentukan dengan menggunakan transformasi di atribut Outputs. Jika file dalam daftar item BuiltAssemblies berubah, tugas Copy hanya berjalan untuk file yang diubah, dan semua file lainnya dilewati. Untuk informasi selengkapnya tentang analisis dependensi dan cara menggunakan transformasi, lihat Cara: Membangun secara bertahap.

<Target Name="CopyOutputs"
    Inputs="@(BuiltAssemblies)"
    Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">

    <Copy
        SourceFiles="@(BuiltAssemblies)"
        DestinationFolder="$(OutputPath)"/>

</Target>

Contoh

Deskripsi

Contoh berikut menunjukkan file proyek MSBuild yang menggunakan transformasi. Contoh ini mengasumsikan bahwa hanya ada satu file .xsd di direktori c:\sub0\sub1\sub2\sub3, dan bahwa direktori kerja adalah c:\sub0.

Kode

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Schema Include="sub1\**\*.xsd"/>
    </ItemGroup>

    <Target Name="Messages">
        <Message Text="rootdir: @(Schema->'%(rootdir)')"/>
        <Message Text="fullpath: @(Schema->'%(fullpath)')"/>
        <Message Text="rootdir + directory + filename + extension: @(Schema->'%(rootdir)%(directory)%(filename)%(extension)')"/>
        <Message Text="identity: @(Schema->'%(identity)')"/>
        <Message Text="filename: @(Schema->'%(filename)')"/>
        <Message Text="directory: @(Schema->'%(directory)')"/>
        <Message Text="relativedir: @(Schema->'%(relativedir)')"/>
        <Message Text="extension: @(Schema->'%(extension)')"/>
    </Target>
</Project>

Komentar

Contoh ini menghasilkan output berikut:

rootdir: C:\
fullpath: C:\sub0\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\sub0\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: sub0\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd