Aracılığıyla paylaş


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ı Compilebir öğ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:

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.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 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 Targetgeç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 Mdeğ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 b2c2öğeden B kaldırılmıştır çünkü:

  • b2ve c2 ile B karşı eşleşmeden A b1 ve M1=2M2=x
  • d2ve üzerindeki B M1=3 ile eşleşmelerden c1 AM2=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 , CaseInsensitiveveya 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ış falseolsa 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 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:
-->