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).

Était-ce utile?

La 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top