Share via


如何:使用不同選項來建置相同的原始程式檔

當您建立專案時,您經常編譯用不同的建置選項的相同的元件。 例如,您可以建立具有符號資訊的偵錯組建,或不具有符號資訊但啟用最佳化之發行的組建 (Release Build)。 此外,您也可以建置在特定平台 (例如 x86 或 x64) 上執行的專案。 上述所有情況中,大部分的建置選項都維持不變,只有少數選項改變,以便控制建置組態。 在 MSBuild 中,您可以使用屬性和條件,建立不同的建置組態。

使用屬性修改專案

Property 項目可以定義在專案檔案中參考多次的變數,例如暫存目錄的位置,也可以設定用於許多組態中的屬性值,例如偵錯組建及發行的組建。 如需屬性的詳細資訊,請參閱 MSBuild 屬性

您可以使用屬性來變更組建的組態,而無需變更專案檔。 Property 項目和 PropertyGroup 項目的 Condition 屬性 (Attribute) 能讓您變更屬性 (Property) 的值。 如需 MSBuild 條件的詳細資訊,請參閱 MSBuild 條件

若要依據另一個屬性設定屬性群組

  • 以與下列類似的方式在 PropertyGroup 項目中使用 Condition 屬性:

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

若要依據另一個屬性定義屬性

  • 以下列方式在 Property 項目中使用 Condition 屬性:

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

在命令列指定屬性

如果您的專案檔撰寫成可接受多重組態,則每次建置專案時,您都必須能夠變更這些組態。 MSBuild 允許於命令列上 /property 或使用**/p** 參數指定屬性的方法,藉此提供這項功能。

若要在命令列上設定專案屬性

  • 請使用 /property 參數並搭配屬性和屬性值。 例如:

    msbuild file.proj /property:Flavor=Debug
    

    -或-

    Msbuild file.proj /p:Flavor=Debug
    

若要在命令列上指定一個以上的專案屬性

  • 請使用 /property/p 參數數次並搭配屬性和屬性值,或者使用一個 /property/p 參數,加上以分號 (;) 分隔的多個屬性。 例如:

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

    -或-

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

環境變數也會視為屬性,MSBuild 自動會將其併入。 如需使用環境變數的詳細資訊,請參閱 如何:在組建中使用環境變數

在命令列上指定的屬性值,其優先順序高於專案檔中為同一個屬性所設定的值,而在專案檔中的屬性值,其優先順序又高於環境變數中的值。

您可以在專案的標記, TreatAsLocalProperty 屬性可以變更這個行為。 列出該屬性的屬性名稱,在命令列上指定的屬性值會優先於專案檔中的值。 您可以找到範例稍後在本主題。

範例

下列程式碼範例中, 「Hello World」專案,其中包含可以用來建立偵錯組建和發行組建的兩個新的屬性群組。

若要建立這個專案的偵錯版本,請輸入:

msbuild consolehwcs1.proj /p:flavor=debug

若要建立這個專案的零售版本,請輸入:

msbuild consolehwcs1.proj /p:flavor=retail

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

    <!-- Sets the default flavor of 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>

下列範例說明如何使用 TreatAsLocalProperty 屬性。 Color 屬性有 Blue 在專案檔和 Green 的值在命令列。 在專案標記的 TreatAsLocalProperty="Color" ,命令列屬性 (Green) 不會覆寫專案檔中的屬性 (Blue) 定義。

若要建立專案,請輸入下列命令:

msbuild colortest.proj /t:go /property:Color=Green

<Project xmlns="https://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
-->

請參閱

參考

Project 項目 (MSBuild)

其他資源

MSBuild

MSBuild 概念

MSBuild 參考