操作項目和屬性的新方法 (MSBuild)
更新:2007 年 11 月
從 MSBuild 3.5 開始,您可以執行下列作業:
定義「項目定義群組」,其中包含套用到專案中所有項目的中繼資料 (Metadata)。
直接在「項目群組」中動態建立、刪除、合併或變更屬性、項目和項目中繼資料。如此就無須使用 CreateItem 工作和 CreateProperty 工作。
項目定義群組
ItemDefinitionGroup 項目可讓您定義一組「項目定義」,這些項目定義是預設套用到專案中所有項目的中繼資料值。如需詳細資訊,請參閱項目定義。
動態調整項目群組中的中繼資料
MSBuild 使用 ItemGroup 項目 (MSBuild) 和 PropertyGroup 項目 (MSBuild) 靜態宣告項目和屬性。在 MSBuild 2.0 中,當您想要在建置期間建立或修改屬性和項目時,必須使用 CreateItem 工作或 CreateProperty 工作。此程序相當麻煩,而且動態更新的效果不佳。相較之下,MSBuild 3.5 就可讓您直接在「項目群組」中動態建立、刪除、合併或變更屬性、項目和項目中繼資料。
請比較下列範例。範例 1 顯示如何使用 CreateItem 工作加入工作參數,以及建立新項目清單和中繼資料。範例 3 則顯示直接在 ItemGroup 中加入中繼資料的新方法。
範例 1:使用 CreateItem 工作加入工作參數的簡單範例。第一個目標使用 CreateItem 工作動態建立名為 CultureResource 的新項目清單。第二個目標則針對原始清單中的所有 Culture 資源,加入名為 TargetDirectory 的新中繼資料。
<Target Name="GenerateBeforeCompile">
<CreateItem Include="SomeGeneratedCode.cs">
<Output TaskParameter="Include" ItemName="Compile" />
</CreateItem>
</Target>
<Target Name="ProcessCultureResources">
<CreateItem Include="@(EmbeddedResource)"
Condition="'%(Culture)' != ''"
AdditionalMetadata="TargetDirectory=%
(EmbeddedResource.Culture)">
<Output TaskParameter="Include" ItemName="CultureResource" />
</CreateItem>
</Target>
範例 2:上述範例所產生的結果,現在可以直接將參數和中繼資料直接加入到 ItemGroup 來完成。
<Target Name="GenerateBeforeCompile">
<ItemGroup>
<Compile Include="SomeGeneratedCode.cs" />
</ItemGroup>
</Target>
<Target Name="ProcessCultureResources">
<ItemGroup>
<CultureResource Include="@(EmbeddedResource)"
Condition="'%(EmbeddedResource.Culture)' != ''">
<TargetDirectory>%(EmbeddedResource.Culture) </TargetDirectory>
</CultureResource>
</ItemGroup>
</Target>
移除項目
在舊版 MSBuild 中,若要省略清單中的項目,就必須建立新清單。不過,現在可以使用新的 Remove 參數直接移除項目,如下所示:
<ItemGroup>
<!—Remove *.licx from the EmbeddedResource list - ->
<EmbeddedResource Remove="*.licx" />
<!—Or remove items in @(licx) from EmbeddedResource list -- >
<EmbeddedResource Remove="@(licx)" />
</ItemGroup>