共用方式為


MSBuild 項目

項目 (Item) 是建置系統的輸入,通常代表檔案。 項目 (Item) 會依據其項目 (Element) 名稱劃分到各個項目 (Item) 類型中。 項目 (Item) 類型是可以做為工作參數之項目 (Item) 的具名清單。 工作會使用這些項目 (Item) 值執行建置程序的步驟。

因為項目 (Item) 的命名是依據其所屬的項目類型而定,所以「項目」和「項目值」這兩個詞彙是可以交替使用的。

在專案檔中建立項目

在專案檔中,會將項目 (Item) 宣告為 ItemGroup 項目 (Element) 的子項目 (Element)。 子項目 (Element) 的名稱為項目 (Item) 的類型。 項目 (Element) 的 Include 屬性會指定該項目 (Item) 類型中包含的項目 (Item)(檔案)。 例如,下列 XML 會建立名為 Compile 的項目 (Item) 類型,其中包含兩個檔案。

<ItemGroup>

<Compile Include = "file1.cs"/>

<Compile Include = "file2.cs"/>

</ItemGroup>

項目 (Item) "file2.cs" 並不會取代項目 "file1.cs",而是會附加到 Compile 項目類型的值清單中。 在組建的評估階段期間,不能從項目類型移除項目。

下列 XML 會藉由在一個 Include 屬性中宣告兩個檔案,建立相同的項目類型。 請注意,檔名是以分號分隔的。

<ItemGroup>

<Compile Include = "file1.cs;file2.cs"/>

</ItemGroup>

在執行期間建立項目

置於 Target 項目 (Element) 外的項目 (Item),是在組建的評估階段期間指派值的。 在後續的執行階段期間,您可以下列方式建立或修改項目 (Item):

  • 項目 (Item) 可以由任何工作發出。 若要發出項目 (Item),Task 項目 (Element) 必須具有包含 ItemName 屬性的子項目 (Element) Output

  • 項目 (Item) 可以由 CreateItem 工作發出。 這個使用方式已被取代。

  • 從 .NET Framework 3.5 開始,Target 項目 (Element) 可以包含可能具有項目之項目 (Item Element) 的 ItemGroup 項目 (Element)。

在專案檔中參考項目

在整個專案檔中,是使用語法 @(ItemType) 參考項目 (Item) 類型的。 例如,上述範例的項目類型應該是藉由使用 @(Compile) 參考的。 這個語法可讓您藉由指定項目類型做為工作參數的方式,將項目傳遞至工作。 如需詳細資訊,請參閱 HOW TO:選取要建置的檔案

根據預設,展開項目類型中的項目時,會以分號 (;) 分隔。 使用 @(ItemType, 'separator') 語法可以指定與預設值不同的分隔符號。 如需詳細資訊,請參閱 HOW TO:顯示以逗號分隔的項目清單

使用萬用字元指定項目

您可以使用 **、* 和 ? 萬用字元指定檔案群組做為組建的輸入,而不分別列出每個檔案。

  • ? 萬用字元會比對單一字元。

  • * 萬用字元會比對零個或多個字元。

  • ** 萬用字元序列會比對一部分路徑。

例如,若要在包含專案檔的目錄中指定所有的 .cs 檔案,請在專案檔中使用下列項目 (Element)︰

<CSFile Include="*.cs"/>

用於選取 D: 磁碟機上所有 .vb 檔案的項目應為

<VBFile Include="D:/**/*.vb"/>.

如需萬用字元的詳細資訊,請參閱 HOW TO:選取要建置的檔案

使用 Exclude 屬性

項目的項目 (Item Element) 可以包含 Exclude 屬性,這個屬性會排除項目 (Item) 類型中的特定項目 (Item) (檔案)。 Exclude 屬性通常是搭配萬用字元使用的。 例如,下列 XML 會將目錄中的每個 .cs 檔案加入至 CSFile 項目 (Item) 類型,但 DoNotBuild.cs 檔案例外。

<ItemGroup>

<CSFile Include="*.cs" Exclude="DoNotBuild.cs"/>

</ItemGroup>

只有在項目的項目 (Item Element) 同時包含 Exclude 屬性和 Include 屬性時,前者才會影響到後者所加入的項目 (Item)。 例如:

<Compile Include="*.cs" />

<Compile Include="*.res" Exclude="Form1.cs">

不會排除前述項目的項目 (Item Element) 中所加入的檔案 Form1.cs。

如需詳細資訊,請參閱 HOW TO:從組建中排除檔案

使用 Remove 屬性

從 .NET Framework 3.5 開始,Target 項目 (Element) 可以包含可能具有項目之項目 (Item Element) 的 ItemGroup 項目 (Element)。 這些項目的項目 (Item Element) 可以包含 Remove 屬性,這個屬性會移除項目 (Item) 類型中的特定項目 (Item)(檔案)。 例如,下列 XML 會從 Compile 項目 (Item) 類型中移除每個 .config 檔案。

<Target>

<ItemGroup>

<Compile Remove="*.config"/>

</ItemGroup>

</Target>

項目中繼資料

項目 (Item) 中除了有從 IncludeExclude 屬性收集的資訊之外,還會包含中繼資料。 這項中繼資料可供需要有關項目 (Item) 之詳細資訊的工作使用,或用於批次處理工作和目標。 如需批次的詳細資訊,請參閱 MSBuild 批次處理

中繼資料是在專案檔中宣告的索引鍵-值組集合,以做為項目的項目 (Item Element) 的子項目 (Element)。 子項目 (Element) 的名稱是中繼資料的名稱,而子項目 (Element) 的值則為中繼資料的值。

中繼資料與其所屬的項目的項目 (Item Element) 是相關聯的。 例如,下列 XML 會將值為 Fr 的 Culture 中繼資料,加入到 CSFile 項目 (Item) 類型的 "one.cs" 和 "two.cs" 這兩個項目 (Item) 中。

<ItemGroup>

<CSFile Include="one.cs;two.cs">

<Culture>Fr</Culture>

</CSFile>

</ItemGroup>

項目 (Item) 可以不包含或包含更多中繼資料值。 中繼資料值是可以在任何階段變更的。 將中繼資料設定為空值,即可以從組建中有效移除該值。

在專案檔中參考項目中繼資料

在整個專案檔中,是使用語法 %(ItemMetadataName) 參考項目 (Item) 中繼資料的。 發生模稜兩可 (Ambiguity) 的情況時,則可以藉由使用項目類型的名稱來限定這個名稱,例如 %(ItemType.ItemMetaDataName)。下列範例會使用 Display 中繼資料來批次處理 Message 工作。 如需如何使用項目中繼資料來進行批次處理的詳細資訊,請參閱 工作批次處理中的項目中繼資料

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Stuff Include="One.cs" >
      <Display>false</Display>
    </Stuff>
    <Stuff Include="Two.cs">
      <Display>true</Display>
    </Stuff>
  </ItemGroup>
  <Target Name="Batching">
    <Message Text="@(Stuff)" Condition=" '%(Display)' == 'true' "/>
  </Target>
</Project>

已知的項目中繼資料

在項目 (Item) 類型中加入項目時,即指派了某些已知的中繼資料給該項目。 例如,所有的項目都具有已知的中繼資料 %(Filename),而其值為該項目的檔名。 如需已知項目中繼資料的清單,請參閱 MSBuild 已知的項目中繼資料

使用中繼資料轉換項目類型

項目 (Item) 清單可以藉由使用中繼資料而轉換為新項目。 例如,具有代表 .cpp 檔案之項目的項目類型 CppFiles,可以藉由使用運算式 @(CppFiles -> '%(Filename).obj') 轉換成對應的 .obj 檔案清單。

下列程式碼所建立的 CultureResource 項目類型中,即包含具有 Culture 中繼資料的所有 EmbeddedResource 項目複本。 Culture 中繼資料值會成為新中繼資料 CultureResource.TargetDirectory 的值。

<Target Name="ProcessCultureResources">
  <ItemGroup>
    <CultureResource Include="@(EmbeddedResource)"
       Condition="'%(EmbeddedResource.Culture)' != ''">
       <TargetDirectory>%(EmbeddedResource.Culture) </TargetDirectory>
    </CultureResource>
  </ItemGroup>
</Target>

如需詳細資訊,請參閱 MSBuild 轉換

項目定義

從 .NET Framework 3.5 開始,ItemDefinitionGroup element可以讓您將預設的中繼資料加入到任何項目 (Item) 類型中。 就像已知的中繼資料一樣,預設中繼資料與指定項目類型的所有項目都有關聯。 預設中繼資料可以在項目定義中明確覆寫。 例如,下列 XML 會將中繼資料 BuildDay 與值 "Monday" 提供給 Compile 項目 "one.cs" 和 "three.cs",並將中繼資料 BuildDay 與值 "Tuesday" 提供給 "two.cs" 項目。

<ItemDefinitionGroup>
  <Compile>
    <BuildDay>Monday</BuildDay>
  </Compile>
</ItemDefinitionGroup>
<ItemGroup>
  <Compile Include="one.cs;three.cs" />
  <Compile Include="two.cs">
    <BuildDay>Tuesday</BuildDay>
  </Compile>
</ItemGroup>

如需詳細資訊,請參閱項目定義

請參閱

工作

HOW TO:選取要建置的檔案

HOW TO:從組建中排除檔案

HOW TO:顯示以逗號分隔的項目清單

參考

Item 項目 (MSBuild)

概念

項目定義

MSBuild 批次處理

其他資源

MSBuild 概念

MSBuild Overview