HOW TO:使用多個專案檔內相同的目標
如果您已撰寫數個 MSBuild 專案檔,可能會發現需要在不同的專案檔中使用相同的工作和目標 (Target)。您不需要在每個專案檔中納入完整的工作或目標描述,只要將目標儲存到個別的專案檔,然後再將該專案匯入到需要使用此目標的其他專案即可。
使用 Import 項目
您可以使用 Import 項目,將一個專案檔插入至另外一個專案檔。要匯入的專案檔必須是有效的 MSBuild 專案檔,並且包含語式正確 (Well-Formed) 的 XML。Project 屬性 (Attribute) 指定了匯入的專案檔路徑。如需 Import 項目的詳細資訊,請參閱 Import 項目 (MSBuild)。
若要匯入專案
在匯入 (Importing) 來源專案檔中定義所有屬性和項目,做為匯入 (Imported) 目標專案中屬性及項目的參數。
使用 Import 項目來匯入專案。例如:
<Import Project="MyCommon.targets"/>
在 Import 項目之後,定義所有必須的屬性及項目,以便於覆寫匯入的專案中屬性及項目的預設定義。
評估的順序
當 MSBuild 到達 Import 項目時,匯入目標專案實際上是插入至匯入來源專案中 Import 項目的位置。因此,Import 項目的位置會影響屬性和項目的值。請務必了解匯入的專案所設定以及使用的屬性和項目。
專案建置 (Build) 時,會先評估所有屬性,然後再評估項目。例如,下列 XML 定義匯入的專案檔 MyCommon.targets:
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyCommon</Name>
</PropertyGroup>
<Target Name="Go">
<Message Text="Name=$(Name)"/>
</Target>
</Project>
下列 XML 定義了 MyApp.proj,這個專案檔會匯入 MyCommon.targets:
<Project
DefaultTargets="Go"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Name>MyApp</Name>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>
建置專案時,會顯示下列訊息:
Name="MyCommon"
由於專案會在屬性 Name 定義於 MyApp.proj 後才匯入,因此 MyCommon.targets 中的 Name 定義會覆寫 MyApp.proj 中的定義。如果專案在定義 Name 屬性之前便已匯入,組建便會顯示下列訊息:
Name="MyApp"
請使用下列方法匯入專案
在專案檔中定義所有屬性和項目,做為匯入的專案中屬性及項目的參數。
匯入專案。
在專案檔中定義所有必須的屬性及項目,以便於覆寫匯入的專案中屬性及項目的預設定義。
範例
在下列程式碼範例中,示範了第二個程式碼範例所匯入的 MyCommon.targets 檔。.targets 檔案會評估匯入來源專案的屬性,以設定組建的組態。
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
<Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
<appname>$(MSBuildProjectName)</appname>
<PropertyGroup>
<Target Name="Build">
<Csc Sources="hello.cs"
Optimize="$(Optimize)"
OutputAssembly="$(appname).exe"/>
</Target>
</Project>
下列程式碼範例會匯入 MyCommon.targets 檔:
<Project DefaultTargets="Build"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Flavor>RETAIL</Flavor>
</PropertyGroup>
<Import Project="MyCommon.targets"/>
</Project>