共用方式為


MSBuild 目標

更新:2007 年 11 月

目標 (Target) 會以特定順序將各項工作集合在一起成為群組,並允許從命令列呼叫建置程序的區段。目標通常會組成邏輯區段,以方便擴充專案檔及增加可讀性。例如,可能有個目標正在刪除輸出目錄中的所有檔案並準備進行建置,而同時另一個目標則在編譯專案的輸入並放入空目錄中。

在專案檔中宣告目標

在專案檔中,目標是使用 Target 項目宣告。例如,下列 XML 會建立名為 Compile 的目標,這個目標接著會使用 Compile 項目集合呼叫 Csc 工作。

<Target Name="Compile>
    <Csc Sources="@(Compile)" />
</Target>

目標也可以使用 Condition 屬性 (Attribute)。如果指定的條件判定為 false,則目標將不會執行,而且 MSBuild 引擎也不會執行在 DependsOnTargets 屬性中指定的目標。如需條件的詳細資訊,請參閱 MSBuild 條件

相依性分析

在進階案例中,目標能夠描述彼此之間的關係並執行相依性分析,如果目標是最新版,即可略過建置處理序的整個區段。您可以使用 DependsOnTargets 屬性,宣告必須在某個特定目標之前執行的目標。當目標執行後,MSBuild 引擎便會自動先執行列在這個屬性中的所有目標。如需詳細資訊,請參閱 HOW TO:累加建置

注意事項:

在單一組建 (Build) 期間,一個目標不能執行兩次。一旦目標開始執行後,就會被認為已完成工作,不能再度執行,即使組建中的後續目標與其有相依關係。

最佳作法

以此方式分割專案檔可變更檔案的區段,而不會影響其他部分。例如,其中一種使用資源建置專案的方式,就是在相同的目標中放置 GenerateResourceCsc 工作,例如:

<Target Name="Build">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

使用這個方法可依需要建置專案,但目標會越來越大而變得不夠彈性。如果您稍後想加入要在 GenerateResourceCsc 之間執行的其他工作,則將這些工作全部放入一個目標中會讓專案檔難以讀取。此外,撰寫這麼大型、包含這麼多工作的目標,就不容易順利累加建置 (Incremental Build),這是指建置時只會針對未曾建置過的目標或重建過期的目標。大型目標也會使您無法執行目標以進行特定工作。在上面的範例中,不進行編譯便無法產生資源。

撰寫專案檔時,最好能使用多個目標並明確表達這些目標之間的相依性。這個方法也可讓您個別執行任何目標,以及執行較少的一組工作,而無須每次建置時都得執行某個目標中冗長的工作清單。在下列程式碼中,每項工作都位於不同的目標中,而且 DependsOnTargets 屬性會指定必須先執行 Resources 目標,才能執行 Build 目標。

<Target Name="Resources">
    <GenerateResource
        Sources="alpha.resx; beta.txt"
        <Output
            TaskParameter="OutputResources"
            ItemName="Resources"/>
    </GenerateResource>
</Target>

<Target Name="Build" DependsOnTargets="Resources">
    <Csc
        Sources="hello.cs"
        Resources="@(Resources)"
        OutputAssembly="hello.exe"/>
</Target>

請參閱

工作

HOW TO:指定要優先建置的目標

HOW TO:使用多個專案檔內相同的目標

概念

MSBuild 概觀

其他資源

MSBuild 概念