1

我有一个带有元数据的项目,我想复制以执行一些操作,结果发生在多个位置,例如,我想将文件复制到多个位置:

<ItemGroup>
  <MyItem Include="myFile.txt">
   <Out>c:\blah;c:\test</Out>
  </MyItem>
</ItemGroup>

如果它们不存在,我将如何设置目标来创建 c:\blah 和 c:\test,然后将 myFile.txt 复制到 c:\blah\myFile.txt 和 c:\test\myFile.txt

如果我想在清理期间清理它们,我还想获取完整输出路径的列表(c:\blah\myFile.txt 和 c:\test\myFile.txt)。

4

3 回答 3

1

如果您不想更改 ItemGroup 的结构,则需要处理您有一个嵌套的 ItemGroup(MetaDataElement Out)。因此,您需要将 ItemGroup MyItem 批处理到目标,并且您可以在其中批处理 Out。我做了一个小示例项目:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="CopyFiles" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
 <ItemGroup>
  <MyItem Include="myFile.txt">
   <Out>c:\blah;c:\test</Out>
  </MyItem>
  <MyItem Include="myFile2.txt">
   <Out>c:\blah2;c:\test2</Out>
  </MyItem>
 </ItemGroup>

 <Target Name="CopyFiles"
      Inputs="%(MyItem.Identity)"
      Outputs="%(MyItem.Identity)\ignore_this.msg">

  <PropertyGroup>
   <File>%(MyItem.Identity)</File>
  </PropertyGroup>

  <ItemGroup>
   <Folders Include="%(MyItem.Out)" />
  </ItemGroup>

  <Message Text="%(Folders.Identity)\$(File)" />    
 </Target>
</Project> 

输出将是:

Project "D:\TEMP\test.proj" on node 1 (default targets).
CopyFiles:
c:\blah\myFile.txt
c:\test\myFile.txt
CopyFiles:
c:\blah2\myFile2.txt
c:\test2\myFile2.txt
Done Building Project "D:\TEMP\test.proj" (default targets).
Build succeeded.
0 Warning(s)
0 Error(s)
于 2013-04-18T14:36:54.957 回答
0

这个怎么样:

<Target Name="CopyFiles">

    <!--The item(s)--> 
    <ItemGroup>
      <MyItem Include="myFile.txt"/>
    </ItemGroup>

    <!--The destinations--> 
    <ItemGroup>
      <MyDestination Include="c:\blah"/>
      <MyDestination Include="c:\test"/>
    </ItemGroup>

    <!--The copy--> 
    <Copy SourceFiles="@(MyItem)" DestinationFolder="%(MyDestination.FullPath)" />
    <ItemGroup>
      <FileWrites Include="%(MyDestination.FullPath)\*" />
    </ItemGroup>

    <!--The output -->
    <Message Text="FileWrites: @(FileWrites)" Importance="high"/>

</Target>
于 2013-04-18T09:20:45.100 回答
0

您想要做的是一个名为MSBuild Batching的概念。它允许您将项目列表划分为不同的批次,并将每个批次分别传递到一个任务中。

<Target Name="CopyFiles">
    <ItemGroup Label="MyFolders">
    <Folder Include="c:\blah" />
    <Folder Include="C:\test" />
</ItemGroup>
    <Copy SourceFiles="myFile.txt" DestinationFolder="%(Folder.Identity)\">
        <Output TaskParameter="CopiedFiles" ItemName="FilesCopy" />
    </Copy>
</Target>
于 2013-04-18T09:07:49.867 回答