目標建置順序
如果某個目標的輸入相依於其他目標的輸出,則必須將目標排序。您可以使用這些屬性來指定目標的執行順序:
InitialTargets.這個 Project 屬性指定最先執行的目標,,即使目標指定在命令列上或 DefaultTargets 屬性。
DefaultTargets.這個 Project atttribute 指定哪些目標執行目標,則在命令列上未明確指定。
DependsOnTargets.這個 Target 屬性必須執行的目標,在此目標可執行之前。
BeforeTargets 和 AfterTargets。這些 Target 屬性指定這個目標應該在指定的目標 (MSBuild 4.0) 之前或之後執行。
在建置期間一個目標只能執行一次,即使組建中的後續目標對此目標具有相依性亦是如此。一旦執行目標後,其對於組建的貢獻便已完成。
目標可以具有 Condition 屬性。如果對 false的指定條件評估為,此目標則不會執行而且對組建沒有任何影響。如需條件的詳細資訊,請參閱 MSBuild 條件。
初始目標
專案 項目的 InitialTargets 屬性指定最先執行的目標,,即使目標指定在命令列上或 DefaultTargets 屬性。初始目標通常用於檢查錯誤。
InitialTargets 屬性的值可以是以分號分隔,目標排序清單。下列範例指定 Warm 目標執行, Eject 物件會執行。
<Project InitialTargets="Warm;Eject" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
匯入的專案可能有自己的 InitialTargets 屬性。所有初始目標會彙總在一起並依序執行。
如需詳細資訊,請參閱HOW TO:指定要優先建置的目標。
預設目標
專案 項目的 DefaultTargets 屬性指定一個或多個目標建置目標,則在命令列上未明確指定。
DefaultTargets 屬性的值可以是以分號分隔),預設目標排序清單。下列範例指定 Clean 目標執行, Build 物件會執行。
<Project DefaultTargets="Clean;Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
您可以在命令列中, /target 參數可以覆寫預設目標。下列範例指定 Build 目標執行, Report 物件會執行。當您以此方式指定目標,所有預設目標被忽略。
msbuild /target:Build;Report
如果初始目標和預設目標,,和,如果命令未指定目標,則 MSBuild 會先執行初始目標,然後執行預設目標。
匯入的專案可能有自己的 DefaultTargets 屬性。第一個遇到的 DefaultTargets 屬性會決定將執行哪些預設目標。
如需詳細資訊,請參閱HOW TO:指定要優先建置的目標。
第一個目標
如果沒有初始目標、預設目標或命令列目標,則 MSBuild 會執行它在專案檔或任何匯入的專案檔中遇到的第一個目標。
目標相依性
目標可以描述彼此的相依性關係。DependsOnTargets 屬性表示某個目標相依於其他目標。例如:
<Target Name="Serve" DependsOnTargets="Chop;Cook" />
告知 MSBuild Serve 目標相依於 Chop 物件和 Cook 物件。在執行 Serve 目標之前, MSBuild 會執行 Chop 目標,然後執行 Cook 目標。
在目標之前並在目標之後
在 MSBuild 4.0 中,您可以使用 BeforeTargets 和 AfterTargets 屬性指定目標順序。
請考慮下列指令碼。
<Project DefaultTargets="Compile;Link" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Compile">
<Message Text="Compiling" />
</Target>
<Target Name="Link">
<Message Text="Linking" />
</Target>
</Project>
建立執行時,在 Compile 目標之後,不過,中的目標 Optimize ,在 Link 物件中,將下列目標任何 Project 項目之前。
<Target Name="Optimize"
AfterTargets="Compile" BeforeTargets="Link">
<Message Text="Optimizing" />
</Target>
決定目標建置順序
MSBuild 決定的目標建置順序如下所示:
InitialTargets 執行目標。
會執行由 /target 參數在命令列上指定的目標。如果您在命令列上未指定目標,則 DefaultTargets 執行目標。如果都不存在,則為遇到的第一個目標執行。
會評估目標的 Condition 屬性。如果 Condition 屬性是 false的存在和評估,此目標則不會執行並沒有對組建的進一步作用。
在執行目標之前,會先執行其 DependsOnTargets 目標。
在執行目標之前,會先執行列於 BeforeTargets 屬性中的任何目標。
在執行目標之前,會先比較其 Inputs 屬性和 Outputs 屬性。如果 MSBuild 判斷所有輸出檔已過期的參考對應的輸入檔案,則 MSBuild 會執行目標。否則,MSBuild 會略過此目標。
在執行或略過目標之後,會執行列於 AfterTargets 屬性中的任何目標。