Import 項目 (MSBuild)
將某個專案檔的內容匯入至另一個專案檔。
<Project><Import>
語法
<Import Project="ProjectPath"
Condition="'String A'=='String B'" />
屬性和元素
下列章節說明屬性、子元素和父元素。
屬性
屬性 | 描述 |
---|---|
Project |
必要屬性。 要匯入之專案檔的路徑。 路徑可以包含萬用字元。 相符的檔案會依排序的順序進行匯入。 使用這項功能,只要將程式碼檔案新增至目錄,就可以將程式碼新增至專案。 |
Condition |
選用屬性。 要評估的條件。 如需詳細資訊,請參閱條件。 |
Label |
選用屬性。 將識別碼套用到此 Import 元素。 |
Sdk |
選用屬性。 參考專案 SDK。 |
子元素
None
父元素
元素 | 描述 |
---|---|
計畫 | MSBuild 專案檔的必要根項目。 |
ImportGroup | 包含群組在選擇性條件下方的 Import 項目集合。 |
備註
使用 Import
項目,您可以重複使用通用於許多專案檔的程式碼。 使用 Import 會讓您更容易維護程式碼,因為您對共用程式碼所做的任何更新,都會傳播到將它匯入的所有專案。
依照慣例,共用的被匯入專案檔會儲存為 .targets
檔案,但它們是標準 MSBuild 專案檔。 MSBuild 可讓您匯入具有不同副檔名的專案,但基於一致性,建議您使用 .targets
副檔名。
被匯入之專案中的相對路徑是相對於匯入之專案的目錄進行解譯的 (除了本段後面所描述的少數例外情況以外)。 因此,如果將專案檔匯入至不同位置中的數個專案檔,則針對每個匯入的專案,會以不同的方式解譯匯入之專案檔中的相對路徑。 有兩個例外狀況。 一個例外狀況是,在 Import
元素中,路徑一律會相對於包含 Import
元素的專案進行解譯。 另一個例外狀況是,UsingTask
一律會相對於包含 UsingTask
元素的檔案來解譯 AssemblyFile
屬性的相對路徑。
所有與被匯入之專案中參考的專案檔相關的 MSBuild 保留屬性 (例如 MSBuildProjectDirectory
和 MSBuildProjectFile
) 都會根據匯入的專案檔來指派值。
如果被匯入的專案沒有 DefaultTargets
屬性,則會依匯入順序來檢查被匯入的專案,而且會使用第一個探索到的 DefaultTargets
屬性值。 例如,如果 ProjectA 匯入 ProjectB 和 ProjectC (依該順序),而且 ProjectB 匯入 ProjectD,則 MSBuild 會依序尋找在 ProjectA、ProjectB、ProjectD 和 ProjectC 上指定的 DefaultTargets
。
匯入之專案的結構描述與標準專案的結構描述完全相同。 雖然 MSBuild 可能可以建置被匯入的專案,但是不太可能,因為被匯入的專案通常不會包含要設定之屬性或目標執行順序的相關資訊。 匯入的專案取決於匯入它以提供該資訊的專案。
萬用字元
在 .NET Framework 4 中,MSBuild 允許在 Project 屬性中使用萬用字元。 有萬用字元時,會排序所有找到的相符項目 (適用於重現性),然後依該順序進行匯入,就像已明確設定順序一樣。
如果您想要提供擴充點,讓其他人可以匯入檔案,而不需要您將檔案名稱明確地新增至匯入檔案,則這非常好用。 基於此目的,Microsoft.Common.Targets 會在檔案頂端包含下行。
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore\*" Condition="'$(ImportByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore')"/>
範例
下列範例示範具有數個項目和屬性並匯入一般專案檔的專案。
<Project DefaultTargets="Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<resourcefile>Strings.resx</resourcefile>
<compiledresources>
$(O)\$(MSBuildProjectName).Strings.resources
</compiledresources>
</PropertyGroup>
<ItemGroup>
<CSFile Include="*.cs" />
<Reference Include="System" />
<Reference Include="System.Data" />
</ItemGroup>
<Import Project="$(CommonLocation)\General.targets" />
</Project>