MSBuild CopyTask:将同一文件复制到多个位置

时间:2010-01-08 09:18:22

标签: msbuild msbuild-task

有没有办法让CopyTask将同一个文件复制到多个位置?

例如。我已经生成了一个AssemblyInfo.cs文件,并希望在构建之前将其复制到我的所有项目中。

3 个答案:

答案 0 :(得分:2)

查看RoboCopy构建任务,该任务是社区构建任务库的一部分,您可以找到here。 RoboCopy可以将一个源文件复制到多个目的地。

旁注:如果在每个项目中需要相同的信息,为什么不在解决方案级别使用一个AssemblyInfo文件并链接到项目中的文件?查看我对此问题的接受答案:Automatic assembly version number management in VS2008

答案 1 :(得分:2)

是的,也许我应该在寻求帮助之前尝试做我想做的事情:)

    <ItemGroup>
        <AssemblyInfoSource 
            Include="AssemblyInfo.cs;AssemblyInfo.cs" />
        <AssemblyInfoDestination
            Include="$(Destination1)\AssemblyInfo.cs;$(Destination2)\AssemblyInfo.cs" />
    </ItemGroup>

    <Copy SourceFiles="@(AssemblyInfoSource)" DestinationFiles="@(AssemblyInfoDestination)" />

答案 2 :(得分:1)

我需要将目录的内容复制到多个位置,这就是我想出来的。所以我在这里发帖,以防其他人有类似的需要,并像我一样遇到这个问题。

<!-- Create a list of the objects in PublishURL so it will copy to multiple directories -->
<ItemGroup>
    <PublishUrls Include="$(PublishUrl)"/>
</ItemGroup>
<PropertyGroup>
   <Files>$(OutputPath)\**\*</Files>
</PropertyGroup>

<!-- CopyNewFiles will copy all the files in $(OutputPath) to all the directories in the
     in $(PublishUrl). $(PublishUrl) can be a single directory, or a list of directories
     separated by a semicolon     -->
<Target Name ="CopyNewFiles">

    <!-- Get list of all files in the output directory; Cross product this with all 
    the output directories. -->
    <CreateItem Include ="$(Files)"
        AdditionalMetadata="RootDirectory=%(PublishUrls.FullPath)">
      <Output ItemName ="OutputFiles" TaskParameter ="Include"/>
    </CreateItem>

    <Message Text="'@(OutputFiles)' -> '%(RootDirectory)\%(RecursiveDir)'"/>

    <Copy  SourceFiles="@(OutputFiles)"
           DestinationFolder ="%(RootDirectory)\%(RecursiveDir)"/>
</Target>

如果您要将AssemblyInfo.cs复制到文件夹AB,则需要设置属性Files="AssemblyInfo.cs"PublishUrls="A;B"

这项工作的原因是CreateItem任务AdditionalMetadata="RootDirectory=%(PublishUrls.FullPath)"中的额外元数据,因此对于File中找到的每个文件,它会为PublishUrls中找到的每个项目创建1个条目。在你的单个文件的情况下,写出xml的equivelent将是:

<ItemGroup>
    <OutputFiles Include="AssemblyInfo.cs">
        <RootDirectory>A</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="AssemblyInfo.cs">
        <RootDirectory>B</RootDirectory>
    </OutputFiles>
</ItemGroup>

现在,如果您复制了将文件1.txt2.txt复制到AB的文件夹的内容,那么等效的xml将是:

<ItemGroup>
    <OutputFiles Include="1.txt">
        <RootDirectory>A</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="2.txt">
        <RootDirectory>A</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="1.txt">
        <RootDirectory>B</RootDirectory>
    </OutputFiles>
    <OutputFiles Include="2.txt">
        <RootDirectory>B</RootDirectory>
    </OutputFiles>
</ItemGroup>