views:

23

answers:

1

I want to create an "ItemGroup" of arbitrary strings / names in order to use MSBuild transforms, for example:

<ItemGroup>
    <Categories>First</Categories>
    <Categories>Second</Categories>
</ItemGroup>

I then wish to pass a transform of these categories into a console app, e.g.:

/c @(Categories, ' /c ')

The reason why I say "ItemGroup" in quotes, is because I'm not sure whether or not it is applicable for me to use ItemGroups in this way - as far as I can see nothing in the documentation states that ItemGroups must be files, however using the above results in an error message due to missing mandatory "Include" attribute.

  • Is there a way of doing the above using ItemGroups?
  • Alternatively is there a better way of achieving the above without using ItemGroups?
+2  A: 

You can use arbitrary string as well as files in Item, but you must use this syntax :

<ItemGroup>
  <Categories Include="First"/>
  <Categories Include="Second"/>
</ItemGroup>

The only difference when you use Item with arbitrary string is that some metadata will be meaningless. (%(Categories.FullPath) for example)

You can then use your Item to execute a command like this :

<Target Name="ExecCommand">
  <Exec Command="YourProgram.exe /c @(Categories, ' /c ')"/>

  <!-- Using transformation -->
  <Exec Command="YourProgram.exe @(Categories -> '/c %(Identity)')"/>
</Target>
madgnome
+1, but note - @(Categories, ' /c ') means that " /c " will be the *separator* between items, so your LAST item will be missing the /c (or FIRST one depending on your POV). You really need a *transform* like this: @(Categories -> '/c %(Identity)') to get the /c in front of ALL your items
Peter McEvoy
Yeah you're right, but that's why he use '/c @(Categories, ' /c ')'
madgnome