Question

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?
Was it helpful?

Solution

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>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top