【问题标题】:MSBuild CopyTask: Copying the same file to multiple locationsMSBuild CopyTask:将同一个文件复制到多个位置
【发布时间】:2012-05-17 02:14:00
【问题描述】:

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

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

【问题讨论】:

  • 为什么要在所有项目中复制同一个 AssemblyInfo 文件?您不能使用指向一个文件的链接吗?
  • 检查我的答案的编辑......如果你喜欢它记得接受;)

标签: msbuild msbuild-task


【解决方案1】:

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

附带说明:如果您在每个项目中都需要相同的信息,为什么不在解决方案级别使用一个 AssemblyInfo 文件并在您的项目中链接到该文件?查看我接受的关于这个问题的答案:Automatic assembly version number management in VS2008

【讨论】:

  • 社区构建任务中MSI打包的版本不是最新的吗?安装后看不到 RoboCopy 任务...(它甚至不在文档或示例项目中)
  • 嗯,奇怪,它在网站上的列表中
【解决方案2】:

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

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

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

【讨论】:

  • 感谢分享。源文件和目标文件的数量是否必须相同?
  • 是的,文件数需要匹配。如果需要,我假设您 可以 重命名目标文件。 msdn.microsoft.com/en-us/library/3e54c37h.aspx(虽然我绝对认为链接的 AssemblyInfo 选项是最好的选择,谢谢 :) 这只是为了完整性)
【解决方案3】:

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

<!-- 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 中找到的每个项目创建一个条目。在您的单个文件的情况下,写出 xml 的等价物是:

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-21
    • 2017-05-23
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多