如何从属性值创建复制项?

时间:2010-05-18 10:02:45

标签: msbuild

假设我有一个子路径列表,例如

 <PropertyGroup>
   <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths>
</PropertyGroup>

我想将这些文件从文件夹A复制到文件夹B(当然我们已经拥有A中的所有子文件夹/文件)。我尝试的是:

<Target Name="Replace" DependsOnTargets="Replace_Init; Replace_Copy1Path">
</Target>

<Target Name="Replace_Init">
  <PropertyGroup>
    <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths>
  </PropertyGroup>
  <ItemGroup>
    <subPathItems Include="$(subPathFiles.Split(';'))" />
  </ItemGroup>
</Target>

<Target Name="Replace_Copy1Path" Outputs="%(subPathItems.Identity)">
  <PropertyGroup>
    <src>$(folderA)\%(subPathItems.Identity)</src>
    <dest>$(folderB)\%(subPathItems.Identity)</dest>
  </PropertyGroup>
  <Copy SourceFiles="$(src)" DestinationFiles="$(dest)" />
</Target>

但是复制任务不起作用。它不会将**\*转换为文件。我做错了什么?请帮忙!

1 个答案:

答案 0 :(得分:2)

我认为你不能做那样的事情。

$(subPathFiles.Split(';'))返回一个属性,其中值以分号分隔,因此此调用无效。

如果您想保留此机制,则应使用MSBuild Extension Pack中的任务StringToItemCol

<Target Name="Replace_Init">
  <PropertyGroup>
    <subPaths>$(path1)\**\*; $(path2)\**\*; $(path3)\file3.txt; </subPaths>
  </PropertyGroup>

  <MsBuildHelper TaskAction="StringToItemCol" 
                 ItemString="$(subPaths)" Separator=";">
    <Output TaskParameter="OutputItems" ItemName="subPathItems "/>
  </MsBuildHelper>
</Target>

否则,您可以直接传递包含folderA和subPaths的项目:

<ItemGroup>
  <subPathIt Include="$(folderA)\$(path1)\**\*"/>
  <subPathIt Include="$(folderA)\$(path2)\**\*"/>
  <subPathIt Include="$(folderA)\$(path3)\file3.txt" Condition="Exists('$(path3)\file3.txt')"/>
</ItemGroup>


<Target Name="Replace_Copy1Path">
  <Copy SourceFiles="@(subPathItems )" 
        DestinationFiles="$(folderB)\%(RecursiveDir)\%(Filename)%(Extension)" />
</Target>