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