在多個專案檔中使用相同的目標

如果您撰寫了數個 MSBuild 專案檔,您可能已發現到需要在不同的專案檔中使用相同的工作和目標。 您可以不在每個專案檔中包含這些工作或目標的完整描述,而是在一個個別的專案檔中儲存目標,然後將該專案匯入到任何其他需要使用該目標的專案中。

使用 Import 項目

使用 Import 元素可將一個專案檔插入到另一個專案檔中。 所要匯入的專案檔必須是有效的 MSBuild 專案檔,並且包含格式正確的 XML。 Project 屬性會指定所匯入之專案檔的路徑。 如需 Import 項目的詳細資訊,請參閱 Import 項目 (MSBuild)

匯入專案

  1. 在匯入端專案檔中,定義用來作為所匯入專案中屬性和項目之參數的所有屬性和項目。

  2. 使用 Import 元素來匯入專案。 例如:

    <Import Project="MyCommon.targets"/>

  3. Import 元素之後,定義必須覆寫所匯入專案中預設屬性和項目定義的所有屬性和項目。

評估順序

當 MSBuild 到達 Import 元素時,會將所匯入之專案有效地插入到匯入端專案中 Import 元素的位置。 因此,Import 元素的位置會影響屬性和項目的值。 請務必了解所匯入之專案所設定的屬性和項目,以及所匯入之專案所使用的屬性和項目。

在組建專案時,會先評估所有屬性,然後才評估項目。 例如,下列 XML 定義所匯入的專案檔 MyCommon.targets

<Project xmlns="http://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="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyApp</Name>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>

在組建專案時,會顯示下列訊息:

Name="MyCommon"

由於會在 MyApp.proj 中定義 Name 屬性之後,才匯入專案;因此 MyCommon.targetsName 的定義會覆寫 MyApp.proj 中的定義。 如果是在定義 Name 屬性之前就匯入專案,組建就會顯示下列訊息:

Name="MyApp"

匯入專案時,請使用下列方法

  1. 在專案檔中,定義用來作為所匯入專案中屬性和項目之參數的所有屬性和項目。

  2. 匯入專案。

  3. 在專案檔中,定義必須覆寫所匯入專案中預設屬性和項目定義的所有屬性和項目。

範例 1

下列程式碼範例示範第二個程式碼範例匯入的 MyCommon.targets 檔案。 .targets 檔案會評估來自匯入端專案的屬性以設定組建。

<Project xmlns="http://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>

範例 2

下列程式碼範例會匯入 MyCommon.targets 檔案。

<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor>RETAIL</Flavor>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>