Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı Compilebir öğe türü oluşturur.
<ItemGroup>
<Compile Include = "file1.cs"/>
<Compile Include = "file2.cs"/>
</ItemGroup>
Öğe file2.cs öğe file1.cs değiştirmez; bunun yerine, dosya adı öğe türü için değerler Compile 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 bir alt
ItemNameöğesi olmalıdır.CreateItem görevi bir öğe yayabilir. Bu kullanım kullanım dışıdır.
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 .vb tüm D: 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 CSFile dosyasını DoNotBuild.cs dosyası dışında öğe türüne ekler.
<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 Include özniteliklerindeki Exclude 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 Kümelemebölümüne bakın.
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 Culture hem de Fr öğelerine sahip meta verileri eklerCSFile.
<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 Display getirmek için meta verileri kullanırMessage. 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>
<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 CppFileskullanarak dosyaları temsil .cpp eden öğeleri olan bir öğe türünü .obj ilgili dosya listesine @(CppFiles -> '%(Filename).obj') dönüştürebilirsiniz.
Aşağıdaki kod, meta veri içeren CultureResource tüm EmbeddedResource öğelerin kopyalarını içeren bir Culture öğe türü oluşturur. Meta Culture veri değeri, yeni meta verilerin CultureResource.TargetDirectorydeğ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 Compile verir ve meta verileri "Monday" değeriyle BuildDay. Kod, meta verileri "Tuesday" değeriyle BuildDay öğeyi 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 ItemGroupTargetgeç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 .config her Compile 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 Bdeğeri MV ile içindeki herhangi bir öğeyle MA eşleşen tüm öğeleri M 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 b2 öğe değerleri c2d2öğeden B kaldırılmıştır çünkü:
-
b2vec2ileBkarşı eşleşmedenb1AveM1=2M2=x -
d2ve üzerindekiBc1ile eşleşmelerdenAM1=3M2=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'
MatchOnMetadata örnek kullanımı:
<_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 , CaseSensitiveveya CaseInsensitiveşeklindedirPathLike. 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>
<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>
<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ış KeepDuplicatesolsa false 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>
<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 (Item1yukarı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 veriler
- 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 Updateaz 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:
-->