代码之家  ›  专栏  ›  技术社区  ›  Maslow

如何基于当前项的目录名从另一个项列表生成MsBuild itemList?

  •  1
  • Maslow  · 技术社区  · 14 年前

    我要一份文件清单 *.config 并将它们复制到目录列表中。目录是相对于路径的 C:\branches\ 有名字然后名称.单元测试.

    所以副本看起来像这样,没有经过重构/批处理:

    <Target Name="CopyClientConfigs">
    
    <ItemGroup>
        <ClientConfigDestinations Include="$(LocalSourcePath)\Module1\Module1.UnitTest\;
        $(LocalSourcePath)\Module2\Module2.UnitTest\;
        $(LocalSourcePath)\CommonControls\Module3\Module3.UnitTest\;
        $(LocalSourcePath)\Administration\Module4\Module4.UnitTest\;
        $(LocalSourcePath)\IndividualControls\Configuration\Module5\Module5.UnitTest\" />
        <ClientConfigs
        Include="$(ClientConfigPath)\*.config"
        Exclude="$(ClientConfigPath)\P*.config" >
        </ClientConfigs>
    </ItemGroup>
    <Copy
            SourceFiles="@(ClientConfigs)"
            DestinationFolder="%(ClientConfigDestinations.FullPath)"
            />
    

    我想要的是能够使用这个项目组

    <ItemGroup>
    <MyModules Include="$(LocalSourcePath)\Module1;
        $(LocalSourcePath)\Module2;
        $(LocalSourcePath)\CommonControls\Module3;
        $(LocalSourcePath)\Administration\Module4;
        $(LocalSourcePath)\IndividualControls\Configuration\Module5"
    />          
    

    Copy
            SourceFiles="@(ClientConfigs)"
            DestinationFolder="%(ClientConfigDestinations.FullPath)\*.UnitTest\"
            />
    

    或者更好

    Copy
            SourceFiles="@(ClientConfigs)"
            DestinationFolder="%(ClientConfigDestinations.FullPath)\%(ClientConfigDestinations.NameOnly).UnitTest\"
            />
    

    如何重构或正确批处理此操作?

    2 回复  |  直到 14 年前
        1
  •  9
  •   Peter McEvoy    14 年前

    如果我没看错你的问题,我 认为

    为此,我有两个项目组:BundleFiles(我要复制的一组文件)和BundleFolders(我要复制到的一组文件夹)。

    <ItemGroup>
        <BundleOutDir Include="FirstFolder;SecondFolder" />
        <BundleFiles Include="file1;file2" />
    </ItemGroup>
    

    我的目标包含如下两个任务:

    <ItemGroup>
        <FilesByDirsCrossProduct Include="@(BundleFiles)">
            <BundleOutDir>%(BundleOutDir.FullPath)</BundleOutDir>
        </FilesByDirsCrossProduct>
    </ItemGroup>
    

    这将创建一个uber项目组,其中包含按文件夹划分的文件的叉积。

    这样一来,拷贝就相当简单了:

    <Copy SourceFiles="@(FilesByDirsCrossProduct)"
        DestinationFiles="@(FilesByDirsCrossProduct -> '%(BundleOutDir)\%(Filename)%(Extension)' ) "
        SkipUnchangedFiles="true" />
    

    然后将文件复制到元数据中指定的文件夹中。

    我的目标实际上更聪明一点,因为我可以声明bundle将转到子文件夹和/或通过元数据在复制过程中重命名文件,但情况不同

        2
  •  1
  •   Maslow    14 年前
    <Target Name="CopyClientConfigsBatched" Outputs="%(MyModules.FullPath)">
        <Message Text="@(MyModules -> '%(FullPath)\%(FileName).UnitTest')"/>
      <ItemGroup>
        <ClientConfigs
        Include="$(ClientConfigPath)\*.config"
        Exclude="$(ClientConfigPath)\P*.config" >
        </ClientConfigs>
      </ItemGroup>
      <Copy SourceFiles="@(ClientConfigs)" DestinationFolder="@(MyModules -> '%(FullPath)\%(FileName).UnitTest')"
         SkipUnchangedFiles="true"/>
    </Target>
    

    目标批处理似乎已经做到了!