共用方式為


為您的來源檔案建立多個組建組態

當您建置專案時,通常會使用不同的建置選項來編譯相同的元件。 例如,您可以使用符號資訊建立偵錯版本,或是在沒有符號資訊的情況下建立發行版本,以進行優化。 或者,您可以建置專案以在特定平台上執行,例如 x86 或 x64。 在這些情況下,大部分的建置選項都保持不變。 只有少數選項會變更以控制組建組態。 使用 MSBuild 時,您會使用屬性和條件來為來源檔案建立不同的組建組態。

使用屬性來控制組建設定

元素 Property 會定義在項目檔中具有多個參考的變數。 變數可能會識別暫存目錄的位置,或設定數個組態中使用的屬性值,例如偵錯和發行組建。 如需屬性的詳細資訊,請參閱 MSBuild 屬性

您可以使用屬性來變更組建的組態,而不需要變更項目檔。 ConditionPropertyGroup 元素的屬性Property可讓您變更屬性的值。

  • 若要定義相依於另一個屬性的屬性,請在Property元素中設定Condition屬性:

    <DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
    
  • 若要定義相依於另一個屬性的屬性群組,請在 元素中PropertyGroup設定 Condition 屬性:

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

如需 MSBuild 條件的詳細資訊,請參閱 條件

在命令行上指定屬性

當您的項目檔接受多個組態時,您需要在建置項目時變更組態的能力。 MSBuild 支援此動作,方法是允許您使用 -property-p 參數在命令行上指定屬性。

  • 若要在指令列設置項目屬性,請使用命令行參數 -property (或 -p),並搭配屬性名稱與其值。

    msbuild file.proj -property:Flavor=Debug
    
  • 若要在命令列指定多個項目屬性,請使用 -property 搭配每個屬性名稱和值的切換(-p)︰

    msbuild file.proj -p:Flavor=Debug -p:Platform=x86
    
  • 在命令行中指定多個屬性時,可以使用快捷方式。 輸入一次 -property-p)開關,並使用分號 ; 分隔屬性名稱和值的清單:

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

處理環境變數和屬性之間的優先順序

MSBuild 會以處理屬性的方式處理環境變數值。 當組建遇到屬性的多個值時,它會根據優先順序設定值:命令行(最高)、專案檔和環境變數(最低)。

  • 命令行上指定的屬性值優先於專案檔或環境變數中針對相同屬性設定的任何值。

  • 項目檔中設定的屬性值優先於環境變數中定義的對應值。

您可以使用項目標記中的 屬性來變更優先順序行為 TreatAsLocalProperty 。 當您列出具有此屬性的屬性名稱時,命令行上指定的屬性值不會優先於項目檔中的值。 如需範例,請參閱 使用 TreatAsLocalProperty 屬性變更優先順序

如需詳細資訊,請參閱 在組建中使用環境變數

使用屬性群組來變更組建組態

下列範例示範項目檔,定義兩個屬性群組來建置專案的偵錯或發行版本。

  • 若要建置偵錯版本,請使用 -property-p) 參數,並將 flavor 屬性值設定為 debug

    msbuild consolehwcs1.proj -p:flavor=debug
    
  • 若要建置發行版本,請使用 -property 切換選項,並將 flavor 屬性值設定為 -pretail

    msbuild consolehwcs1.proj -p:flavor=retail
    

以下是項目檔:

<Project DefaultTargets = "Compile">

    <!-- Set default flavor, if env variable 'Flavor' not set or specified on command line -->
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
    </PropertyGroup>

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

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

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

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

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

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

使用 TreatAsLocalProperty 屬性變更優先順序

下列範例說明如何使用 TreatAsLocalProperty 屬性。 屬性Color在項目檔中的值是Blue,在命令行中的值是GreenTreatAsLocalProperty="Color"使用項目標記中的屬性設定時,命令行屬性 (Green) 不會覆寫項目檔中定義的屬性值 。Blue

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

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

以下是項目檔:

<Project 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
-->