Import 項目 (MSBuild)
將一個專案檔的內容匯入至另一個專案檔。
<Import Project="ProjectPath"
Condition="'String A'=='String B'" />
屬性和項目
下列章節會說明屬性、子項目和父項目。
屬性
屬性 |
描述 |
---|---|
Project |
必要屬性。 要匯入的專案檔路徑。 路徑可以包含萬用字元。 符合的檔案是依照排序次序匯入。 使用此功能時,您只需將程式碼檔案加入至目錄,就可以將程式碼加入至專案。 |
Condition |
選擇性屬性。 要評估的條件。 如需詳細資訊,請參閱 MSBuild 條件。 |
子項目
None
父項目
項目 |
描述 |
---|---|
MSBuild 專案檔的必要根項目。 |
|
包含根據選擇性條件組成群組的 Import 項目集合。 |
備註
您可以使用 Import 項目重複使用許多專案檔通用的程式碼。 由於您對共用程式碼所做的任何更新都會傳播到將其匯入的所有專案,這使得程式碼的維護更加輕鬆。
依照慣例,一般匯入的專案檔會儲存為 .targets 檔,而不是標準的 MSBuild 專案檔。 MSBuild 不會阻止您匯入具有不同副檔名的專案,但為了一致性,建議您使用 .targets 副檔名。
匯入目標專案中的相對路徑,都會解譯成相對於匯入來源專案的目錄。 因此,如果將專案檔匯入至許多不同位置的專案檔,則匯入目標專案檔中的相對路徑,就會根據每個匯入來源專案而有不同的解譯。
所有與專案檔相關的 MSBuild 保留屬性,例如,MSBuildProjectDirectory 和 MSBuildProjectFile (這些是在匯入目標專案中參考的屬性),都會根據匯入來源專案檔來指派屬性值。
如果匯入來源專案沒有 DefaultTargets 屬性,就會以匯入的順序來檢查匯入目標專案,並且使用第一個發現的 DefaultTargets 屬性值。 例如,如果 ProjectA 依序匯入 ProjectB 和 ProjectC,而且 ProjectB 匯入 ProjectD,MSBuild 會依序在 ProjectA、ProjectB、ProjectD 和 ProjectC 尋找指定的 DefaultTargets。
匯入的專案結構描述與標準專案的結構描述相同。 雖然 MSBuild 可能可以建置匯入的專案,但由於匯入的專案通常不包含要設定的屬性以及執行目標的順序等資訊,因此多半無法進行建置。 匯入的專案會依據其所匯入的專案來提供這些資訊。
注意事項 |
---|
條件式匯入陳述式雖然可以在命令列 MSBuild 中使用,但不適用於 Visual Studio 整合式開發環境 (IDE) 中的 MSBuild。條件式匯入是使用專案載入時所設定的組態和平台值評估的。如果後來所做的變更需要重新評估專案檔中的條件 (例如變更平台),Visual Studio 就會對屬性和項目重新評估這些條件,但不會對匯入重新評估這些條件。由於匯入條件不會重新評估,因此會略過匯入。 若要解決這個問題,請將條件式匯入置於 .targets 檔案,或將程式碼置於如 Choose 項目 (MSBuild) 區塊的條件式區塊中。 |
萬用字元
在 .NET Framework 4 中,MSBuild 允許在專案屬性中使用萬用字元。 使用萬用字元時,會將找到的所有符合項目排序 (以便能夠重現),然後依照該順序加以匯入,就像已經明確設定此順序一樣。
如果您想要提供擴充點讓其他人可以匯入檔案,而不需要您明確將檔案名稱加入至匯入的檔案,這就非常有用。 為此目的,Microsoft.Common.Targets 會在檔案頂端包含以下這一行。
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore\*" Condition="'$(ImportByWildcardBeforeMicrosoftCommonTargets)' == 'true' and exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore')"/>
範例
下列範例示範的專案具有數個項目和屬性,並且會匯入一般專案檔。
<Project DefaultTargets="Compile"
xmlns="https://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>