MSBuild öğeleri
MSBuild öğeleri derleme sistemine girişlerdir ve genellikle dosyaları temsil eder (dosyalar öznitelikte Include
belirtilir). Öğeler, öğe adlarına göre öğe türleri halinde gruplandırılır. Öğe türleri, görevler için parametre olarak kullanılabilecek öğelerin adlandırılmış listeleridir. Görevler, derleme işleminin adımlarını gerçekleştirmek için öğe değerlerini kullanır.
Öğeler ait oldukları öğe türüne göre adlandırıldığından, "öğe" ve "öğe değeri" terimleri birbirinin yerine kullanılabilir.
Proje dosyasında öğe oluşturma
Proje dosyasındaki öğeleri bir ItemGroup öğesinin alt öğeleri olarak bildirirsiniz. Geçerli öğe adları büyük harf veya küçük harf veya alt çizgi (_
) ile başlar; geçerli sonraki karakterler alfasayısal karakterler (harfler veya basamaklar), alt çizgi ve kısa çizgi (-
) içerir. Alt öğenin adı öğenin türüdür. Include
öğesinin özniteliği, bu öğe türüne eklenecek öğeleri (dosyaları) belirtir. Örneğin, aşağıdaki XML iki dosya içeren adlı Compile
bir öğe türü oluşturur.
<ItemGroup>
<Compile Include = "file1.cs"/>
<Compile Include = "file2.cs"/>
</ItemGroup>
öğe file2.cs , öğe file1.cs yerini almaz; bunun yerine, dosya adı öğe türü için Compile
değerler listesine eklenir.
Aşağıdaki XML, her iki dosyayı da tek Include
bir öznitelikte bildirerek aynı öğe türünü oluşturur. Dosya adlarının noktalı virgülle ayrıldığına dikkat edin.
<ItemGroup>
<Compile Include = "file1.cs;file2.cs"/>
</ItemGroup>
Include
özniteliği, $(MSBuildProjectPath)
öğe dosya gibi içeri aktarılan bir dosyada olsa bile proje dosyasının klasörüne göre yorumlanan bir .targets
yoldur.
Yürütme sırasında öğe oluşturma
Hedef öğelerinin dışındaki öğelere, derlemenin değerlendirme aşamasında değerler atanır. Sonraki yürütme aşamasında, öğeler aşağıdaki yollarla oluşturulabilir veya değiştirilebilir:
Herhangi bir görev bir öğe yayabilir. Öğe yaymak için, Task öğesinin özniteliği olan
ItemName
bir alt Output öğesi olmalıdır.CreateItem görevi bir öğe yayabilir. Bu kullanım önerilmiyor.
Target
öğeleri, öğe öğeleri içerebilen ItemGroup öğeleri içerebilir.
Proje dosyasındaki başvuru öğeleri
Proje dosyasının tamamında öğe türlerine başvurmak için söz dizimini @(ItemType)
kullanırsınız. Örneğin, kullanarak @(Compile)
önceki örnekteki öğe türüne başvurabilirsiniz. Bu söz dizimini kullanarak, öğe türünü bu görevin parametresi olarak belirterek öğeleri görevlere geçirebilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Derlemek için dosyaları seçme.
Varsayılan olarak, öğe türünün öğeleri noktalı virgülle (genişletildiğinde ;)) ayrılır. Söz dizimini @(ItemType, 'separator')
kullanarak varsayılandan farklı bir ayırıcı belirtebilirsiniz. Daha fazla bilgi için bkz . Nasıl yapılır: Virgülle ayrılmış bir öğe listesi görüntüleme.
Öğeleri belirtmek için joker karakter kullanma
Bir grup dosyayı ayrı ayrı listelemek yerine bir derleme için giriş olarak belirtmek için , *
ve ?
joker karakterlerini kullanabilirsiniz**
.
- Joker
?
karakter tek bir karakterle eşleşir. - Joker
*
karakter sıfır veya daha fazla karakterle eşleşir. - Joker
**
karakter dizisi kısmi bir yol ile eşleşir.
Örneğin, proje dosyanızda aşağıdaki öğeyi .cs
kullanarak proje dosyasını içeren dizindeki tüm dosyaları belirtebilirsiniz.
<CSFile Include="*.cs"/>
Aşağıdaki öğe sürücüdeki D:
tüm .vb
dosyaları seçer:
<VBFile Include="D:/**/*.vb"/>
Joker karakter genişletmesi olmayan bir öğeye değişmez *
değer veya ?
karakterler eklemek istiyorsanız joker karakterlerden kaçmalısınız.
Joker karakterler hakkında daha fazla bilgi için bkz . Nasıl yapılır: Derlemek için dosyaları seçme.
Exclude özniteliğini kullanma
Öğe öğeleri, belirli öğeleri (dosyaları) öğe türünden dışlayan özniteliğini içerebilir Exclude
. Exclude
özniteliği genellikle joker karakterlerle birlikte kullanılır. Örneğin, aşağıdaki XML dizindeki her .cs dosyasını DoNotBuild.cs dosyası dışında öğe türüne ekler.CSFile
<ItemGroup>
<CSFile Include="*.cs" Exclude="DoNotBuild.cs"/>
</ItemGroup>
Exclude
özniteliği yalnızca her ikisini de içeren öğe öğesinde özniteliği tarafından Include
eklenen öğeleri etkiler. Aşağıdaki örnek, önceki öğe öğesine eklenen dosya Form1.cs dışlamaz.
<Compile Include="*.cs" />
<Compile Include="*.res" Exclude="Form1.cs">
Daha fazla bilgi için bkz . Nasıl yapılır: Dosyaları derlemenin dışında tutma.
Öğe meta verileri
Öğeler ve Exclude
özniteliklerindeki Include
bilgilere ek olarak meta veriler içerebilir. Bu meta veriler, öğeler hakkında daha fazla bilgi gerektiren görevler veya toplu görevler ve hedefler için kullanılabilir. Daha fazla bilgi için bkz . Batching.
Meta veriler, proje dosyasında bir öğe öğesinin alt öğeleri olarak bildirilen anahtar-değer çiftleri koleksiyonudur. Alt öğenin adı meta verilerin adıdır ve alt öğenin değeri meta verilerin değeridir.
Meta veriler, onu içeren öğe öğesiyle ilişkilendirilir. Örneğin, aşağıdaki XML değeri öğe türünün hem one.cs hem de two.cs öğelerine CSFile
sahip meta verileri Fr
eklerCulture
.
<ItemGroup>
<CSFile Include="one.cs;two.cs">
<Culture>Fr</Culture>
</CSFile>
</ItemGroup>
Bir öğe sıfır veya daha fazla meta veri değerine sahip olabilir. Meta veri değerlerini istediğiniz zaman değiştirebilirsiniz. Meta verileri boş bir değere ayarlarsanız, bunu derlemeden etkili bir şekilde kaldırırsınız.
Proje dosyasındaki başvuru öğesi meta verileri
söz dizimini %(ItemMetadataName)
kullanarak proje dosyasının her yanında öğe meta verilerine başvurabilirsiniz. Belirsizlik varsa, öğe türünün adını kullanarak bir başvuruyu niteleyebilirsiniz. Örneğin, belirtebilirsiniz %(ItemType.ItemMetaDataName)
. Aşağıdaki örnek, görevi toplu hale Message
getirmek için meta verileri kullanırDisplay
. Toplu işlem için öğe meta verilerini kullanma hakkında daha fazla bilgi için bkz . Görev toplu işleminde öğe meta verileri.
<Project xmlns="http://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>
İyi bilinen öğe meta verileri
Bir öğe bir öğe türüne eklendiğinde, bu öğeye bazı iyi bilinen meta veriler atanır. Örneğin, tüm öğeler iyi bilinen meta verilerine %(Filename)
sahiptir ve değeri öğenin dosya adıdır (uzantı olmadan). Daha fazla bilgi için bkz . İyi bilinen öğe meta verileri.
Meta verileri kullanarak öğe türlerini dönüştürme
Meta verileri kullanarak öğe listelerini yeni öğe listelerine dönüştürebilirsiniz. Örneğin, ifadesini @(CppFiles -> '%(Filename).obj')
kullanarak dosyaları temsil .cpp
eden öğeleri olan bir öğe türünü CppFiles
ilgili dosya listesine .obj
dönüştürebilirsiniz.
Aşağıdaki kod, meta veri içeren Culture
tüm EmbeddedResource
öğelerin kopyalarını içeren bir CultureResource
öğe türü oluşturur. Meta Culture
veri değeri, yeni meta verilerin CultureResource.TargetDirectory
değeri olur.
<Target Name="ProcessCultureResources">
<ItemGroup>
<CultureResource Include="@(EmbeddedResource)"
Condition="'%(EmbeddedResource.Culture)' != ''">
<TargetDirectory>%(EmbeddedResource.Culture) </TargetDirectory>
</CultureResource>
</ItemGroup>
</Target>
Öğeler üzerinde daha fazla işlem için bkz . MSBuild öğe işlevleri ve Dönüşümler.
Öğe tanımları
ItemDefinitionGroup öğesini kullanarak herhangi bir öğe türüne varsayılan meta veriler ekleyebilirsiniz. İyi bilinen meta veriler gibi varsayılan meta veriler de belirttiğiniz öğe türündeki tüm öğelerle ilişkilendirilir. Bir öğe tanımındaki varsayılan meta verileri açıkça geçersiz kılabilirsiniz. Örneğin, aşağıdaki XML one.cs öğeleri verir Compile
ve meta verileri BuildDay
"Pazartesi" değeriyle three.cs. Kod, meta verileri BuildDay
"Tuesday" değeriyle two.cs öğeye verir.
<ItemDefinitionGroup>
<Compile>
<BuildDay>Monday</BuildDay>
</Compile>
</ItemDefinitionGroup>
<ItemGroup>
<Compile Include="one.cs;three.cs" />
<Compile Include="two.cs">
<BuildDay>Tuesday</BuildDay>
</Compile>
</ItemGroup>
Daha fazla bilgi için bkz . Öğe tanımları.
Bir Hedefin ItemGroup'unda öğeler için öznitelikler
Target
öğeleri, öğe öğeleri içerebilen ItemGroup öğeleri içerebilir. Bu bölümdeki öznitelikler, içindeki bir öğe için belirtildiğinde ItemGroup
Target
geçerlidir.
Özniteliği kaldır
özniteliği, Remove
öğe türünden belirli öğeleri (dosyaları) kaldırır. Bu öznitelik .NET Framework 3.5'te tanıtıldı (yalnızca hedeflerin içinde). MSBuild 15.0'dan başlayarak hem iç hem de dış hedefler desteklenir.
Aşağıdaki örnek, öğe türünden Compile
her .config
dosyayı kaldırır.
<Target>
<ItemGroup>
<Compile Remove="*.config"/>
</ItemGroup>
</Target>
MatchOnMetadata özniteliği
MatchOnMetadata
özniteliği yalnızca diğer öğelere Remove
başvuran öznitelikler için geçerlidir (örneğin, Remove="@(Compile);@(Content)"
) ve öğe değerlerine göre eşleştirmek yerine belirtilen meta veri adlarının değerlerine göre öğeleri eşleştirmek için işleme yönergesi Remove
verir.
için B Remove="@(A)" MatchOnMetadata="M"
eşleştirme kuralı: meta verileri olan ve meta veri M
değeri V
M
ile içindeki herhangi bir öğeyle A
M
eşleşen tüm öğeleri B
kaldırınV
.
<Project>
<ItemGroup>
<A Include='a1' M1='1' M2='a' M3="e"/>
<A Include='b1' M1='2' M2='x' M3="f"/>
<A Include='c1' M1='3' M2='y' M3="g"/>
<A Include='d1' M1='4' M2='b' M3="h"/>
<B Include='a2' M1='x' m2='c' M3="m"/>
<B Include='b2' M1='2' m2='x' M3="n"/>
<B Include='c2' M1='2' m2='x' M3="o"/>
<B Include='d2' M1='3' m2='y' M3="p"/>
<B Include='e2' M1='3' m2='Y' M3="p"/>
<B Include='f2' M1='4' M3="r"/>
<B Include='g2' M3="s"/>
<B Remove='@(A)' MatchOnMetadata='M1;M2'/>
</ItemGroup>
<Target Name="PrintEvaluation">
<Message Text="%(B.Identity) M1='%(B.M1)' M2='%(B.M2)' M3='%(B.M3)'" />
</Target>
</Project>
Örnekte , ve d2
öğe değerleri b2
c2
öğeden B
kaldırılmıştır çünkü:
b2
vec2
ileB
karşı eşleşmedenA
b1
veM1=2
M2=x
d2
ve üzerindekiB
M1=3
ile eşleşmelerdenc1
A
M2=y
Görev Message
aşağıdaki çıkışları oluşturur:
a2 M1='x' M2='c' M3='m'
e2 M1='3' M2='Y' M3='p'
f2 M1='4' M2='' M3='r'
g2 M1='' M2='' M3='s'
MSBuild'den örnek kullanımıMatchOnMetadata
:
<_TransitiveItemsToCopyToOutputDirectory Remove="@(_ThisProjectItemsToCopyToOutputDirectory)" MatchOnMetadata="TargetPath" MatchOnMetadataOptions="PathLike" />
Bu satır, içindeki öğelerden _TransitiveItemsToCopyToOutputDirectory
aynı TargetPath
meta veri değerlerine sahip öğeleri kaldırır _ThisProjectItemsToCopyToOutputDirectory
MatchOnMetadataOptions özniteliği
tarafından meta veri değerlerini öğeler arasında eşleştirmek için kullanılan MatchOnMetadata
dize eşleştirme stratejisini belirtir (meta veri adları her zaman büyük/küçük harfe duyarsız olarak eşleştirilir). Olası değerler , CaseInsensitive
veya PathLike
şeklindedirCaseSensitive
. Varsayılan değer şudur: CaseSensitive
.
PathLike
eğik çizgi yönlendirmelerini normalleştirme, sondaki eğik çizgileri yoksayma, ve 'yi ortadan kaldırma .
ve ..
tüm göreli yolları geçerli dizine karşı mutlak hale getirme gibi değerlere yol algılayan normalleştirme uygular.
KeepMetadata özniteliği
Hedef içinde bir öğe oluşturulursa, öğe öğesi özniteliğini KeepMetadata
içerebilir. Bu öznitelik belirtilirse, kaynak öğeden hedef öğeye yalnızca noktalı virgülle ayrılmış ad listesinde belirtilen meta veriler aktarılır. Bu öznitelik için boş bir değer, belirtilmemesiyle eşdeğerdir. KeepMetadata
özniteliği .NET Framework 4.5'te tanıtıldı.
Aşağıdaki örnekte özniteliğinin nasıl kullanılacağı gösterilmektedir KeepMetadata
.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0">
<ItemGroup>
<FirstItem Include="rhinoceros">
<Class>mammal</Class>
<Size>large</Size>
</FirstItem>
</ItemGroup>
<Target Name="MyTarget">
<ItemGroup>
<SecondItem Include="@(FirstItem)" KeepMetadata="Class" />
</ItemGroup>
<Message Text="FirstItem: %(FirstItem.Identity)" />
<Message Text=" Class: %(FirstItem.Class)" />
<Message Text=" Size: %(FirstItem.Size)" />
<Message Text="SecondItem: %(SecondItem.Identity)" />
<Message Text=" Class: %(SecondItem.Class)" />
<Message Text=" Size: %(SecondItem.Size)" />
</Target>
</Project>
<!--
Output:
FirstItem: rhinoceros
Class: mammal
Size: large
SecondItem: rhinoceros
Class: mammal
Size:
-->
RemoveMetadata özniteliği
Hedef içinde bir öğe oluşturulursa, öğe öğesi özniteliğini RemoveMetadata
içerebilir. Bu öznitelik belirtilirse, adları noktalı virgülle ayrılmış ad listesinde yer alan meta veriler dışında tüm meta veriler kaynak öğeden hedef öğeye aktarılır. Bu öznitelik için boş bir değer, belirtilmemesiyle eşdeğerdir. RemoveMetadata
özniteliği .NET Framework 4.5'te tanıtıldı.
Aşağıdaki örnekte özniteliğinin nasıl kullanılacağı gösterilmektedir RemoveMetadata
.
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<MetadataToRemove>Size;Material</MetadataToRemove>
</PropertyGroup>
<ItemGroup>
<Item1 Include="stapler">
<Size>medium</Size>
<Color>black</Color>
<Material>plastic</Material>
</Item1>
</ItemGroup>
<Target Name="MyTarget">
<ItemGroup>
<Item2 Include="@(Item1)" RemoveMetadata="$(MetadataToRemove)" />
</ItemGroup>
<Message Text="Item1: %(Item1.Identity)" />
<Message Text=" Size: %(Item1.Size)" />
<Message Text=" Color: %(Item1.Color)" />
<Message Text=" Material: %(Item1.Material)" />
<Message Text="Item2: %(Item2.Identity)" />
<Message Text=" Size: %(Item2.Size)" />
<Message Text=" Color: %(Item2.Color)" />
<Message Text=" Material: %(Item2.Material)" />
</Target>
</Project>
<!--
Output:
Item1: stapler
Size: medium
Color: black
Material: plastic
Item2: stapler
Size:
Color: black
Material:
-->
Öğeler üzerinde daha fazla işlem için bkz . MSBuild öğe işlevleri.
KeepDuplicates özniteliği
Hedef içinde bir öğe oluşturulursa, öğe öğesi özniteliğini KeepDuplicates
içerebilir. KeepDuplicates
, öğe var olan bir Boolean
öğenin tam bir kopyasıysa, bir öğenin hedef gruba eklenip eklenmeyeceğini belirten bir özniteliktir.
Kaynak ve hedef öğe aynı Include
değere ama farklı meta veriye sahipse, öğesi olarak ayarlanmış false
olsa KeepDuplicates
bile eklenir. Bu öznitelik için boş bir değer, belirtilmemesiyle eşdeğerdir. KeepDuplicates
özniteliği .NET Framework 4.5'te tanıtıldı.
Aşağıdaki örnekte özniteliğinin nasıl kullanılacağı gösterilmektedir KeepDuplicates
.
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Item1 Include="hourglass;boomerang" />
<Item2 Include="hourglass;boomerang" />
</ItemGroup>
<Target Name="MyTarget">
<ItemGroup>
<Item1 Include="hourglass" KeepDuplicates="false" />
<Item2 Include="hourglass" />
</ItemGroup>
<Message Text="Item1: @(Item1)" />
<Message Text=" %(Item1.Identity) Count: @(Item1->Count())" />
<Message Text="Item2: @(Item2)" />
<Message Text=" %(Item2.Identity) Count: @(Item2->Count())" />
</Target>
</Project>
<!--
Output:
Item1: hourglass;boomerang
hourglass Count: 1
boomerang Count: 1
Item2: hourglass;boomerang;hourglass
hourglass Count: 2
boomerang Count: 1
-->
özniteliği, KeepDuplicates
öğe değerlerine ek olarak öğelerin meta verilerini de dikkate alır, meta verilerde neler olduğunu bilmek önemlidir. Örneğin, bkz . Meta Veri öğesi işlevi kullanılırken yinelenenleri algılama.
Hedef dışındaki bir ItemGroup içindeki öğelerde meta verileri güncelleştirme
Hedeflerin dışındaki öğeler, özniteliği aracılığıyla mevcut meta verilerini güncelleştirebilir Update
. Bu öznitelik, hedeflerin altındaki öğeler için kullanılamaz.
<Project>
<PropertyGroup>
<MetadataToUpdate>pencil</MetadataToUpdate>
</PropertyGroup>
<ItemGroup>
<Item1 Include="stapler">
<Size>medium</Size>
<Color>black</Color>
<Material>plastic</Material>
</Item1>
<Item1 Include="pencil">
<Size>small</Size>
<Color>yellow</Color>
<Material>wood</Material>
</Item1>
<Item1 Include="eraser">
<Color>red</Color>
</Item1>
<Item1 Include="notebook">
<Size>large</Size>
<Color>white</Color>
<Material>paper</Material>
</Item1>
<Item2 Include="notebook">
<Size>SMALL</Size>
<Color>YELLOW</Color>
</Item2>
<!-- Metadata can be expressed either as attributes or as elements -->
<Item1 Update="$(MetadataToUpdate);stapler;er*r;@(Item2)" Price="10" Material="">
<Color>RED</Color>
</Item1>
</ItemGroup>
<Target Name="MyTarget">
<Message Text="Item1: %(Item1.Identity)
Size: %(Item1.Size)
Color: %(Item1.Color)
Material: %(Item1.Material)
Price: %(Item1.Price)" />
</Target>
</Project>
<!--
Item1: stapler
Size: medium
Color: RED
Material:
Price: 10
Item1: pencil
Size: small
Color: RED
Material:
Price: 10
Item1: eraser
Size:
Color: RED
Material:
Price: 10
Item1: notebook
Size: large
Color: RED
Material:
Price: 10
-->
MSBuild sürüm 16.6 ve sonraki sürümlerinde özniteliği, Update
meta verilerin iki veya daha fazla öğeden içeri aktarılmasını kolaylaştırmak için nitelikli meta veri başvurularını destekler.
<Project>
<ItemGroup>
<Item1 Include="stapler">
<Size>medium</Size>
<Color>black</Color>
<Material>plastic</Material>
</Item1>
<Item1 Include="pencil">
<Size>small</Size>
<Color>yellow</Color>
<Material>wood</Material>
</Item1>
<Item1 Include="eraser">
<Size>small</Size>
<Color>red</Color>
<Material>gum</Material>
</Item1>
<Item1 Include="notebook">
<Size>large</Size>
<Color>white</Color>
<Material>paper</Material>
</Item1>
<Item2 Include="pencil">
<Size>MEDIUM</Size>
<Color>RED</Color>
<Material>PLASTIC</Material>
<Price>10</Price>
</Item2>
<Item3 Include="notebook">
<Size>SMALL</Size>
<Color>BLUE</Color>
<Price>20</Price>
</Item3>
<!-- Metadata can be expressed either as attributes or as elements -->
<Item1 Update="@(Item2);er*r;@(Item3)" Size="%(Size)" Color="%(Item2.Color)" Price="%(Item3.Price)" Model="2020">
<Material Condition="'%(Item2.Material)' != ''">Premium %(Item2.Material)</Material>
</Item1>
</ItemGroup>
<Target Name="MyTarget">
<Message Text="Item1: %(Item1.Identity)
Size: %(Item1.Size)
Color: %(Item1.Color)
Material: %(Item1.Material)
Price: %(Item1.Price)
Model: %(Item1.Model)" />
</Target>
</Project>
<!--
Item1: stapler
Size: medium
Color: black
Material: plastic
Price:
Model:
Item1: pencil
Size: small
Color: RED
Material: Premium PLASTIC
Price:
Model: 2020
Item1: eraser
Size: small
Color:
Material: gum
Price:
Model: 2020
Item1: notebook
Size: large
Color:
Material: paper
Price: 20
Model: 2020
-->
Açıklamalar:
- Nitelenmemiş meta veriler (
%(MetadataName)
) güncelleştirilmekte olan öğe türüne bağlanır (Item1
yukarıdaki örnekte). Nitelenmiş meta veriler (%(Item2.Color)
), Update ifadesinden yakalanan eşleşen öğe türleri kümesinin içine bağlanır. - Bir öğe birden çok başvuruda belirtilen öğe içinde ve arasında birden çok kez eşleşiyorsa:
- Başvuruda bulunan her öğe türünden son oluşum yakalanır (böylece öğe türü başına bir öğe yakalanır).
- Bu, hedefler altında görev öğesi toplu işleminin davranışıyla eşleşir.
- Burada %() başvurularını koyabilirsiniz:
- Meta veri
- Meta veri koşulları
- Meta veri adı eşleştirme büyük/küçük harfe duyarlı değildir.
Bir Hedefin ItemGroup'unda öğelerde meta verileri güncelleştirme
Meta veriler hedeflerin içinde de değiştirilebilir ve daha Update
az açıklayıcı bir söz dizimi ile değiştirilebilir:
<Project>
<ItemGroup>
<Item1 Include="stapler">
<Size>medium</Size>
<Color>black</Color>
<Material>plastic</Material>
</Item1>
<Item1 Include="pencil">
<Size>small</Size>
<Color>yellow</Color>
<Material>wood</Material>
</Item1>
<Item1 Include="eraser">
<Size>small</Size>
<Color>red</Color>
<Material>gum</Material>
</Item1>
<Item1 Include="notebook">
<Size>large</Size>
<Color>white</Color>
<Material>paper</Material>
</Item1>
<Item2 Include="pencil">
<Size>MEDIUM</Size>
<Color>RED</Color>
<Material>PLASTIC</Material>
<Price>10</Price>
</Item2>
<Item2 Include="ruler">
<Color>GREEN</Color>
</Item2>
</ItemGroup>
<Target Name="MyTarget">
<ItemGroup>
<!-- Metadata can be expressed either as attributes or as elements -->
<Item1 Size="GIGANTIC" Color="%(Item2.Color)">
<Material Condition="'%(Item2.Material)' != ''">Premium %(Item2.Material)</Material>
</Item1>
</ItemGroup>
<Message Text="Item1: %(Item1.Identity)
Size: %(Item1.Size)
Color: %(Item1.Color)
Material: %(Item1.Material)
Price: %(Item1.Price)
Model: %(Item1.Model)" />
</Target>
</Project>
<!--
Item1: stapler
Size: GIGANTIC
Color: GREEN
Material: Premium PLASTIC
Price:
Model:
Item1: pencil
Size: GIGANTIC
Color: GREEN
Material: Premium PLASTIC
Price:
Model:
Item1: eraser
Size: GIGANTIC
Color: GREEN
Material: Premium PLASTIC
Price:
Model:
Item1: notebook
Size: GIGANTIC
Color: GREEN
Material: Premium PLASTIC
Price:
Model:
-->