Question

I have an ItemGroup of installers and each one contains a Property which is the name of out output folder (delimited) like this:

<ItemGroup>
  <Installers Include="Installer1.msi">
    <Folders>Folder1,Folder4</Folders>
  </Installers>

  <Installers Include="Installer2.msi">
    <Folders>Folder1,Folder2,Folder3,Folder4</Folders>
  </Installers>
</ItemGroup>

I would like to be able to copy each installer into each folder that's specified. I've been back and forth trying to figure out a way to add additional metadata to Installers, but just can't seem to get a final list of something like this:

  1. Installer1.msi:Folder1
  2. Installer1.msi:Folder4
  3. Installer2.msi:Folder1
  4. Installer2.msi:Folder2
  5. Installer2.msi:Folder3
  6. Installer2.msi:Folder4

So I could execute something like this:

<Copy SourceFiles="@(Installers)" DestinationFolder="%(Installers.Folder)" />

I know I can modify my ItemGroup to this:

<ItemGroup>
  <Installers Include="Installer1.msi">
    <Folder>Folder1</Folder>
  </Installers>
  <Installers Include="Installer1.msi">
    <Folder>Folder4</Folder>
  </Installers>

  <Installers Include="Installer2.msi">
    <Folder>Folder1</Folder>
  </Installers>
  <Installers Include="Installer2.msi">
    <Folder>Folder2</Folder>
  </Installers>
  <Installers Include="Installer2.msi">
    <Folder>Folder3</Folder>
  </Installers>
  <Installers Include="Installer2.msi">
    <Folder>Folder4</Folder>
  </Installers>
</ItemGroup>

but I'd rather not, as that's what we have now and people always miss things (because it's so verbose).

Was it helpful?

Solution

Separate folder names with semicolons, then invert the installer and folder values:

<Project ToolsVersion="4.0" DefaultTargets="Inversionator" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <Folders Include="Folder1;Folder4">
            <Installer>Installer1.msi</Installer>
        </Folders>
        <Folders Include="Folder1;Folder2;Folder3;Folder4">
            <Installer>Installer2.msi</Installer>
        </Folders>
    </ItemGroup>

    <Target Name="Inversionator">
        <Message Text="%(Folders.Installer) %(Folders.Identity) " Importance="high" />
    </Target>
</Project>

Output for the task is now:

Installer1.msi Folder1
Installer1.msi Folder4
Installer2.msi Folder1
Installer2.msi Folder2
Installer2.msi Folder3
Installer2.msi Folder4
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top