Membangun file sumber yang sama dengan opsi yang berbeda

Saat membuat proyek, Anda sering mengompilasi komponen yang sama dengan opsi build yang berbeda. Misalnya, Anda dapat membuat build debug dengan informasi simbol atau build rilis tanpa informasi simbol tetapi dengan pengoptimalan diaktifkan. Atau Anda dapat membangun proyek untuk dijalankan pada platform tertentu, seperti x86 atau x64. Dalam semua kasus ini, sebagian besar opsi build tetap sama; hanya beberapa opsi yang diubah untuk mengontrol konfigurasi build. Dengan MSBuild, Anda menggunakan properti dan kondisi untuk membuat konfigurasi build yang berbeda.

Menggunakan properti untuk mengontrol pengaturan build

Elemen Property menentukan variabel yang direferensikan beberapa kali dalam file proyek, seperti lokasi direktori sementara, atau untuk mengatur nilai untuk properti yang digunakan dalam beberapa konfigurasi, seperti build Debug dan build Rilis. Untuk informasi selengkapnya tentang properti, lihat Properti MSBuild.

Anda dapat menggunakan properti untuk mengubah konfigurasi build tanpa harus mengubah file proyek. Atribut ConditionProperty elemen dan PropertyGroup elemen memungkinkan Anda mengubah nilai properti. Untuk informasi selengkapnya tentang kondisi MSBuild, lihat Kondisi.

Untuk mengatur grup properti yang bergantung pada properti lain

  • Gunakan atribut Condition dalam PropertyGroup elemen yang mirip dengan yang berikut ini:

    <PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
        <DebugType>full</DebugType>
        <Optimize>no</Optimize>
    </PropertyGroup>
    

Untuk menentukan properti yang bergantung pada properti lain

  • Gunakan atribut Condition dalam Property elemen yang mirip dengan yang berikut ini:

    <DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
    

Tentukan properti pada baris perintah

Setelah file proyek Anda ditulis untuk menerima beberapa konfigurasi, Anda harus memiliki kemampuan untuk mengubah konfigurasi tersebut setiap kali Anda membangun proyek Anda. MSBuild menyediakan kemampuan ini dengan memungkinkan properti ditentukan pada baris perintah menggunakan sakelar -properti atau -p.

Untuk mengatur properti proyek di baris perintah

  • Gunakan sakelar -properti dengan nilai properti dan properti. Contohnya:

    msbuild file.proj -property:Flavor=Debug
    

    atau

    Msbuild file.proj -p:Flavor=Debug
    

Untuk menentukan lebih dari satu properti proyek di baris perintah

  • Gunakan sakelar -properti atau -p beberapa kali dengan nilai properti dan properti, atau gunakan satu -properti atau sakelar -p dan pisahkan beberapa properti dengan titik koma (;). Contohnya:

    msbuild file.proj -p:Flavor=Debug;Platform=x86
    

    atau

    msbuild file.proj -p:Flavor=Debug -p:Platform=x86
    

    Variabel lingkungan juga diperlakukan sebagai properti dan secara otomatis dimasukkan oleh MSBuild. Untuk informasi selengkapnya tentang menggunakan variabel lingkungan, lihat Cara: Menggunakan variabel lingkungan dalam build.

    Nilai properti yang ditentukan pada baris perintah lebih diutamakan daripada nilai apa pun yang diatur untuk properti yang sama dalam file proyek, dan nilai tersebut dalam file proyek lebih diutamakan daripada nilai dalam variabel lingkungan.

    Anda dapat mengubah perilaku ini dengan menggunakan atribut TreatAsLocalProperty dalam tag proyek. Untuk nama properti yang tercantum dengan atribut tersebut, nilai properti yang ditentukan pada baris perintah tidak lebih diutamakan daripada nilai dalam file proyek. Anda dapat menemukan contoh nanti dalam topik ini.

Contoh 1

Contoh kode berikut, proyek "Halo Dunia", berisi dua grup properti baru yang dapat digunakan untuk membuat build Debug dan build Rilis.

Untuk membangun versi debug proyek ini, ketik:

msbuild consolehwcs1.proj -p:flavor=debug

Untuk membangun versi ritel proyek ini, ketik:

msbuild consolehwcs1.proj -p:flavor=retail
<Project DefaultTargets = "Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <!-- Sets the default flavor if an environment variable called
    Flavor is not set or specified on the command line -->
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
    </PropertyGroup>

    <!-- Define the DEBUG settings -->
    <PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
        <DebugType>full</DebugType>
        <Optimize>no</Optimize>
    </PropertyGroup>

    <!-- Define the RETAIL settings -->
    <PropertyGroup Condition="'$(Flavor)'=='RETAIL'">
        <DebugType>pdbonly</DebugType>
        <Optimize>yes</Optimize>
    </PropertyGroup>

    <!-- Set the application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldCS</appname>
    </PropertyGroup>

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <CSFile Include = "consolehwcs1.cs"/>
    </ItemGroup>

    <Target Name = "Compile">
        <!-- Run the Visual C# compilation using input files
        of type CSFile -->
        <CSC  Sources = "@(CSFile)"
            DebugType="$(DebugType)"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe" >

            <!-- Set the OutputAssembly attribute of the CSC
            task to the name of the executable file that is
            created -->
            <Output TaskParameter="OutputAssembly"
                ItemName = "EXEFile" />
        </CSC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Contoh 2

Contoh berikut menggambarkan cara menggunakan TreatAsLocalProperty atribut. Properti Color memiliki nilai Blue dalam file proyek dan Green di baris perintah. Dengan TreatAsLocalProperty="Color" dalam tag proyek, properti baris perintah (Green) tidak mengganti properti yang ditentukan dalam file proyek (Blue).

Untuk membangun proyek, masukkan perintah berikut:

msbuild colortest.proj -t:go -property:Color=Green
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0" TreatAsLocalProperty="Color">

    <PropertyGroup>
        <Color>Blue</Color>
    </PropertyGroup>

    <Target Name="go">
        <Message Text="Color: $(Color)" />
    </Target>
</Project>

<!--
  Output with TreatAsLocalProperty="Color" in project tag:
     Color: Blue

  Output without TreatAsLocalProperty="Color" in project tag:
     Color: Green
-->