MSBuild在分隔字符串上透视ItemGroup

时间:2014-01-30 19:14:19

标签: msbuild msbuild-4.0

我有一个安装程序的ItemGroup,每个包含一个Property,它是out输出文件夹的名称(分隔),如下所示:

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

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

我希望能够将每个安装程序复制到指定的每个文件夹中。我一直在试图想出一种向安装程序添加额外元数据的方法,但似乎无法获得这样的最终列表:

  1. Installer1.msi:Folder1中
  2. Installer1.msi:Folder4
  3. Installer2.msi:Folder1中
  4. Installer2.msi:FOLDER2
  5. Installer2.msi:Folder3
  6. Installer2.msi:Folder4
  7. 所以我可以执行这样的事情:

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

    我知道我可以将我的ItemGroup修改为:

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

    但我不愿意,因为这就是我们现在拥有的东西,人们总是会错过任何东西(因为它很冗长)。

1 个答案:

答案 0 :(得分:0)

用分号分隔文件夹名称,然后反转安装程序和文件夹值:

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

现在任务的输出:

Installer1.msi Folder1
Installer1.msi Folder4
Installer2.msi Folder1
Installer2.msi Folder2
Installer2.msi Folder3
Installer2.msi Folder4