Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az MSBuild elemek bemenetek a buildelési rendszerbe, és általában fájlokat jelölnek (a fájlokat az Include attribútum adja meg). Az elemek elemtípusokba vannak csoportosítva az elemnevek alapján. Az elemtípusok olyan elemek nevesített listájai, amelyek a tevékenységek paramétereiként használhatók. A feladatok az elemértékekkel hajtják végre a buildelési folyamat lépéseit.
Mivel az elemek neve az az elemtípus, amelyhez tartoznak, az "elem" és az "elemérték" kifejezés felcserélhető.
Elemek létrehozása projektfájlban
A projektfájl elemeit elemcsoportelem gyermekelemeként deklarálhatja. Az érvényes elemnevek nagybetűvel vagy kisbetűvel vagy aláhúzásjellel kezdődnek(_); az érvényes további karakterek közé tartoznak az alfanumerikus karakterek (betűk vagy számjegyek), az aláhúzás és a kötőjel (-). A gyermekelem neve az elem típusa. Az Include elem attribútuma határozza meg az adott elemtípushoz hozzáadni kívánt elemeket (fájlokat). A következő XML például létrehoz egy elnevezett Compileelemtípust, amely két fájlt tartalmaz.
<ItemGroup>
<Compile Include = "file1.cs"/>
<Compile Include = "file2.cs"/>
</ItemGroup>
A file2.cs elem nem helyettesíti az elemet file1.cs; ehelyett a fájlnév hozzá lesz fűzve az elemtípus értékeinek listájához Compile .
Az alábbi XML ugyanazt az elemtípust hozza létre úgy, hogy mindkét fájlt egy Include attribútumban deklarálja. Figyelje meg, hogy a fájlneveket pontosvessző választja el egymástól.
<ItemGroup>
<Compile Include = "file1.cs;file2.cs"/>
</ItemGroup>
Az Include attribútum egy olyan elérési út, amely a projektfájl mappája alapján van értelmezve, még akkor is, $(MSBuildProjectPath)ha az elem egy importált fájlban, például egy .targets fájlban található.
Elemek létrehozása a végrehajtás során
A Célelemeken kívül eső elemek a build kiértékelési fázisában vannak hozzárendelve értékekhez. A következő végrehajtási fázisban az elemek a következő módokon hozhatók létre vagy módosíthatók:
Bármely tevékenység kibocsáthat egy elemet. Elem kibocsátásához a Tevékenység elemnek rendelkeznie kell egy attribútummal rendelkező gyermek
ItemNameelemmel.A CreateItem tevékenység kibocsáthat egy elemet. Ez a használat elavult.
Targetelemek tartalmazhatnak elemelemeket tartalmazó ItemGroup-elemeket .
Projektfájl hivatkozási elemei
Ha a projektfájlban az elemtípusokra szeretne hivatkozni, használja a szintaxist @(ItemType). Például az előző példában szereplő elemtípusra hivatkozhat a használatával @(Compile). Ezzel a szintaxissal elemeket adhat át a tevékenységeknek úgy, hogy megadja az elemtípust a tevékenység paramétereként. További információ : Útmutató: Válassza ki a létrehozandó fájlokat.
Az elemtípus elemei alapértelmezés szerint pontosvesszővel vannak elválasztva (;) kibontásakor. A szintaxissal @(ItemType, 'separator') megadhat egy elválasztót, amely nem az alapértelmezett. További információ : Útmutató: Elemlista megjelenítése vesszővel elválasztva.
Elemek megadása helyettesítő karakterek használatával
A **, *, és ? helyettesítő karakterek használatával megadhat egy fájlcsoportot bemenetként egy buildhez, ahelyett, hogy külön listázni szeretné az egyes fájlokat.
- A
?helyettesítő karakter egyetlen karakterrel egyezik. - A
*helyettesítő karakter nulla vagy több karakternek felel meg. - A
**helyettesítő karaktersorozat egy részleges elérési útnak felel meg.
Megadhatja például a .cs projektfájlt tartalmazó könyvtár összes fájlját a projektfájl alábbi elemével.
<CSFile Include="*.cs"/>
A következő elem az összes .vb fájlt kijelöli a D: meghajtón:
<VBFile Include="D:/**/*.vb"/>
Ha a helyettesítő karakterek kiterjesztése nélkül szeretne literális * vagy ? karaktereket belefoglalni egy elembe, akkor el kell menekülnie a helyettesítő karakterek elől.
További információ a helyettesítő karakterekről : Útmutató: Válassza ki a létrehozandó fájlokat.
A Kizárás attribútum használata
Az elemelemek tartalmazhatják az Exclude attribútumot, amely kizár bizonyos elemeket (fájlokat) az elemtípusból. Az Exclude attribútumot általában helyettesítő karakterekkel együtt használják. Az alábbi XML például hozzáadja a könyvtár minden .cs fájlját az CSFile elemtípushoz, kivéve a DoNotBuild.cs fájlt.
<ItemGroup>
<CSFile Include="*.cs" Exclude="DoNotBuild.cs"/>
</ItemGroup>
Az Exclude attribútum csak azokat az elemeket érinti, amelyeket az Include attribútum hozzáad a mindkettőt tartalmazó elemelemhez. Az alábbi példa nem zárja ki a fájl Form1.cs, amely az előző elemelemben lett hozzáadva.
<Compile Include="*.cs" />
<Compile Include="*.res" Exclude="Form1.cs">
További információ : How to: Exclude files from the build.
Elem metaadatai
Az elemek metaadatokat is tartalmazhatnak a benne és Include az Exclude attribútumokban található információk mellett. Ezeket a metaadatokat olyan tevékenységek használhatják, amelyek további információkat igényelnek az elemekről, vagy kötegelhetik a tevékenységeket és célokat. További információ: Batching.
A metaadatok kulcs-érték párok gyűjteménye, amelyeket a projektfájl egy elemelem gyermekelemeként deklarál. A gyermekelem neve a metaadatok neve, a gyermekelem értéke pedig a metaadatok értéke.
A metaadatok az azt tartalmazó elemelemhez lesznek társítva. Az alábbi XML például olyan metaadatokat ad Culture hozzá, amelyek az Fr és two.cs elemeire egyaránt érvényesekCSFile.
<ItemGroup>
<CSFile Include="one.cs;two.cs">
<Culture>Fr</Culture>
</CSFile>
</ItemGroup>
Egy elemnek nulla vagy több metaadatértéke lehet. A metaadat-értékeket bármikor módosíthatja. Ha üres értékre állítja a metaadatokat, gyakorlatilag eltávolítja azt a buildből.
Referenciaelem metaadatai egy projektfájlban
Az elem metaadataira a projektfájlban a szintaxis %(ItemMetadataName)használatával hivatkozhat. Ha kétértelműség áll fenn, a hivatkozás az elemtípus nevével minősíthető. Például megadhatja %(ItemType.ItemMetaDataName). Az alábbi példa a Display metaadatok használatával kötegeli a Message feladatot. További információ az elem metaadatainak kötegeltítéshez való használatáról: Item metadata in task batching.
<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>
Jól ismert elem metaadatai
Amikor egy elemet hozzáad egy elemtípushoz, az elemhez hozzá lesz rendelve néhány jól ismert metaadat. Például minden elem rendelkezik a jól ismert metaadatokkal %(Filename), amelyek értéke az elem fájlneve (a bővítmény nélkül). További információkért lásd a jól ismert elem metaadatait.
Elemtípusok átalakítása metaadatok használatával
Metaadatok használatával új elemlistákká alakíthatja az elemlistákat. A kifejezés CppFileshasználatával például átalakíthat egy olyan elemtípust.cpp, amely fájlokat ábrázoló .obj elemeket tartalmaz.@(CppFiles -> '%(Filename).obj')
Az alábbi kód létrehoz egy elemtípust CultureResource , amely az összes EmbeddedResource metaadatot tartalmazó elem másolatát Culture tartalmazza. A Culture metaadat-érték lesz az új metaadatok CultureResource.TargetDirectoryértéke.
<Target Name="ProcessCultureResources">
<ItemGroup>
<CultureResource Include="@(EmbeddedResource)"
Condition="'%(EmbeddedResource.Culture)' != ''">
<TargetDirectory>%(EmbeddedResource.Culture) </TargetDirectory>
</CultureResource>
</ItemGroup>
</Target>
További műveletek az elemeken: MSBuild elemfüggvények és átalakítások.
Elemdefiníciók
Az ItemDefinitionGroup elem használatával bármilyen elemtípushoz hozzáadhat alapértelmezett metaadatokat. A jól ismert metaadatokhoz hasonlóan az alapértelmezett metaadatok is a megadott elemtípus összes eleméhez társítva lesznek. Az elemdefiníciókban explicit módon felülbírálhatja az alapértelmezett metaadatokat. Az alábbi XML például a Compile "Hétfő" értékkel one.cs és three.cs a metaadatokat BuildDay . A kód megadja az elemet , two.cs a metaadatokat BuildDay a "Kedd" értékkel.
<ItemDefinitionGroup>
<Compile>
<BuildDay>Monday</BuildDay>
</Compile>
</ItemDefinitionGroup>
<ItemGroup>
<Compile Include="one.cs;three.cs" />
<Compile Include="two.cs">
<BuildDay>Tuesday</BuildDay>
</Compile>
</ItemGroup>
További információ: Elemdefiníciók.
Attribútumok egy cél elemcsoportjában lévő elemekhez
Target elemek tartalmazhatnak elemelemeket tartalmazó ItemGroup-elemeket . Az ebben a szakaszban szereplő attribútumok akkor érvényesek, ha egy adott elemhez ItemGroup vannak megadva.Target
Attribútum eltávolítása
Az Remove attribútum eltávolít bizonyos elemeket (fájlokat) az elemtípusból. Ez az attribútum a .NET Framework 3.5-ben lett bevezetve (csak a célokon belül). Az MSBuild 15.0-tól kezdve a belső és a külső célok is támogatottak.
Az alábbi példa minden .config fájlt eltávolít az Compile elemtípusból.
<Target>
<ItemGroup>
<Compile Remove="*.config"/>
</ItemGroup>
</Target>
MatchOnMetadata attribútum
Az MatchOnMetadata attribútum csak Remove olyan attribútumokra alkalmazható, amelyek más elemekre hivatkoznak (például ), és utasítja a Remove="@(Compile);@(Content)" műveletet, Removehogy az elemeket a megadott metaadatnevek értékei alapján egyezzen meg az elemértékek helyett.
A következőhöz B Remove="@(A)" MatchOnMetadata="M"tartozó egyező szabály: Távolítsa el az összes olyan elemetB, amelynek metaadatai MV megegyeznek MA az érték Mmetaadataival V .
<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>
A példában az elemértékek b2, c2és d2 az elemből B el lesznek távolítva, mert:
-
b2ésc2aBmérkőzés ellenb1aAM1=2M2=x -
d2a mérkőzésekBközöttc1aAM1=3M2=y
A Message feladat a következőket adja ki:
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'
Az MatchOnMetadata példahasználata:
<_TransitiveItemsToCopyToOutputDirectory Remove="@(_ThisProjectItemsToCopyToOutputDirectory)" MatchOnMetadata="TargetPath" MatchOnMetadataOptions="PathLike" />
Ez a sor eltávolítja azokat az elemeket _TransitiveItemsToCopyToOutputDirectory , amelyekben ugyanazok TargetPath a metaadatértékek szerepelnek a következő elemekben: _ThisProjectItemsToCopyToOutputDirectory
MatchOnMetadataOptions attribútum
Megadja a metaadatok értékeinek elemek közötti egyeztetéséhez használt MatchOnMetadata sztringegyeztetési stratégiát (a metaadatnevek mindig érzéketlenek). A lehetséges értékek a következők CaseSensitive: , CaseInsensitivevagy PathLike. Az alapértelmezett érték a CaseSensitive.
PathLike útvonalérzékeny normalizálást alkalmaz az olyan értékekre, mint a perjelek tájolásának normalizálása, a záró perjelek figyelmen kívül hagyása, a kizárás . és ..az összes relatív elérési út abszolútvá tétele az aktuális könyvtárhoz képest.
KeepMetadata attribútum
Ha egy elem egy célon belül jön létre, az elemelem tartalmazhatja az KeepMetadata attribútumot. Ha ez az attribútum meg van adva, csak a pontosvesszővel tagolt nevek listájában megadott metaadatok kerülnek át a forráselemből a célelembe. Az attribútum üres értéke egyenértékű azzal, hogy nem adja meg. Az KeepMetadata attribútum a .NET-keretrendszer 4.5-ös kiadásában lett bevezetve.
Az alábbi példa az attribútum használatát KeepMetadata mutatja be.
<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 attribútum
Ha egy elem egy célon belül jön létre, az elemelem tartalmazhatja az RemoveMetadata attribútumot. Ha ez az attribútum meg van adva, az összes metaadat át lesz adva a forráselemből a célelembe, kivéve azokat a metaadatokat, amelyek neve szerepel a pontosvesszővel tagolt nevek listájában. Az attribútum üres értéke egyenértékű azzal, hogy nem adja meg. Az RemoveMetadata attribútum a .NET-keretrendszer 4.5-ös kiadásában lett bevezetve.
Az alábbi példa az attribútum használatát RemoveMetadata mutatja be.
<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:
-->
Az elemekkel kapcsolatos további műveletekért tekintse meg az MSBuild elemfüggvényeket.
KeepDuplicates attribútum
Ha egy elem egy célon belül jön létre, az elemelem tartalmazhatja az KeepDuplicates attribútumot.
KeepDuplicates egy Boolean attribútum, amely meghatározza, hogy hozzá kell-e adni egy elemet a célcsoporthoz, ha az elem egy meglévő elem pontos másolata.
Ha a forrás- és célelem ugyanazzal Include az értékkel rendelkezik, de más metaadatokkal rendelkezik, akkor is hozzáadja az elemet, ha KeepDuplicates a beállítás értéke false. Az attribútum üres értéke egyenértékű azzal, hogy nem adja meg. Az KeepDuplicates attribútum a .NET-keretrendszer 4.5-ös kiadásában lett bevezetve.
Az alábbi példa az attribútum használatát KeepDuplicates mutatja be.
<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
-->
Mivel az attribútum az KeepDuplicates elemértékek mellett az elemek metaadatait is figyelembe veszi, fontos tudni, hogy mi történik a metaadatokkal. Lásd például az Ismétlődések észlelése a Metaadatok elemfüggvény használatakor című témakört.
Metaadatok frissítése célon kívüli ItemGroup-elemeken
A célokon kívüli elemek az attribútumon keresztül frissíthetik meglévő Update metaadataikat. Ez az attribútum nem érhető el a célok alatt lévő elemekhez.
<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
-->
Az MSBuild 16.6-os és újabb verzióiban az attribútum támogatja a Update minősített metaadat-hivatkozásokat, hogy megkönnyítse a metaadatok importálását két vagy több elemből.
<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
-->
Megjegyzések:
- A nem minősített metaadatok (
%(MetadataName)) a frissítendő elemtípushoz kötődnek (Item1a fenti példában). A minősített metaadatok (%(Item2.Color)) az Update kifejezés rögzített egyező elemtípusainak készletén belül kötnek. - Ha egy elem többszörösen egyezik több hivatkozott elemen belül és között:
- Az egyes hivatkozott elemtípusok utolsó előfordulása rögzítve lesz (tehát elemtípusonként egy rögzített elem).
- Ez megegyezik a tevékenységelem-kötegelés viselkedésével a célok alatt.
- Ahol %() hivatkozásokat helyezhet el:
- Metadaták
- Metaadat-feltételek
- A metaadatok nevének egyeztetése kis- és nagybetűket nem érzékelyítő.
Metaadatok frissítése egy cél elemcsoportjában lévő elemeken
A metaadatok a célokon belül is módosíthatók kevésbé kifejező szintaxissal, mint Update:
<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:
-->