Msbuild根据目标参数列表复制到多个位置?

时间:2009-05-29 08:28:26

标签: msbuild copy msbuild-task msbuild-propertygroup

我有一个我想要复制到多个位置的目录。

说我有

  • home.aspx

我想将其复制到

  • ABC / home.aspx
  • DEF / home.aspx
  • GHI / home.aspx

对我来说有两个问题:

  • 如何定义列表abc,def,ghi?
  • 如何使用此列表的每个元素执行我的复制任务?

4 个答案:

答案 0 :(得分:9)

以下是我放在一起展示您所寻找内容的实际示例:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test" ToolsVersion="3.5">

  <!--Declare an ItemGroup that points to your file you want to copy.-->
  <ItemGroup>
    <ItemToCopy Include=".\Home.aspx" />
  </ItemGroup>

  <!--Declare an ItemGroup that points to your destination Locations-->
  <ItemGroup>
    <DestLocations Include=".\abc\home.aspx" />
    <DestLocations Include=".\def\home.aspx" />
    <DestLocations Include=".\ghi\home.aspx" />
  </ItemGroup>

  <Target Name="CopyFiles">
    <!--Run the copy command to copy the item to your dest locations-->
    <!--This is where the magic happens.  The % sign before the DestLocations reference says to use
    Batching.  So Copy will be run for each unique FullPath MetaData in the DestLocations ItemGroup.-->
    <Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DestLocations.FullPath)" />
  </Target>
</Project>

答案 1 :(得分:2)

您应该感兴趣的概念称为Batching

我已在我的博客http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx

上介绍了这个确切的情况

以下是该博客条目的文字,您可以在上面的链接下载上述文件。


今天有人告诉我一个与MSBuild有问题的同事。他告诉我他正试图将一组文件复制到一组不同的服务器上。但问题是他不知道如何在不执行多个复制任务调用的情况下实现此目的。我告诉他,他可以使用MSBuild Batching实现这一目标。批处理是一次对一组项目(批处理)执行任务(或目标)的过程。批次还可以包括单个项目。因此,在这种情况下,我们需要为他想要部署的每个服务器执行一次复制。我创建了一个简单的msbuild文件,它以两种不同的方式演示了这一点。第一种方法使用任务批处理,可以在测试目标中看到。另一个使用目标批处理,可以在DoItCore目标中看到。我还创建了一个干净的目标,它与批处理无关。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test">

      <ItemGroup>
            <SourceFiles Include="*.txt"/>
            <Dest Include="One;Two;Three;Four;Five"/>
      </ItemGroup>

      <Target Name="Test">
            <Copy SourceFiles ="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
            <Message Text="Fullpath: %(Dest.FullPath)"/>
      </Target>


      <!-- These targets demonstrate target batching -->
      <Target Name="DoIt" DependsOnTargets="DoItCore"/>
      <Target Name="DoItCore" Inputs="@(SourceFiles)" Outputs="%(Dest.FullPath)">
            <Copy SourceFiles="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
      </Target>


      <!-- This will clean up the files -->
      <Target Name="Clean">
            <CreateItem Include="%(Dest.FullPath)\**\*">
                  <Output ItemName="FilesToDelete" TaskParameter="Include"/>
            </CreateItem>
            <Delete Files="@(FilesToDelete)"/>
      </Target>
</Project>

批处理是MSBuild的一个高级主题,并且被彻底忽略。我不得不承认我自己没有写足够的内容。有一些很好的批处理资源,它们列在下面。


以下是我发布的其他一些与批处理相关的博客条目。

谢谢, Sayed Ibrahim Hashimi

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

答案 2 :(得分:0)

你最好自己做这个学习练习,而不是将MSBUILD视为魔术盒。 This article from Patrick Smacchia为您提供了大部分相关技术。

答案 3 :(得分:0)

有一个项目组,您可以在其中构建此目的地列表(“&lt; Destination&gt; abc&lt; / Destionation&gt; ...等)。然后使用此列表调用复制任务(@Destination)。

如果你搜索它,我相信你会找到很多例子。 http://keithhill.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3dMSBuild