如何让MSBuild将标记为Content的所有文件复制到文件夹中,保留文件夹结构?

时间:2011-10-04 05:26:15

标签: msbuild

作为我的解决方案构建的一部分,我想将所有“内容”文件(asp?x等)复制到另一个文件夹。由于这些在项目中被如此清晰地标记,我认为必须有一种简单的方法来复制这些,而不是用xcopy编写我自己的后期构建步骤。 不幸的是我无法解决这个问题 - 这个msbuild的东西与我的大脑不相容。 我只想要一个步骤 但无法弄清楚要使用的语法。

Bat文件语法建议不能解决这个问题 - 只应用纯msbuild解决方案

谢谢, 每

3 个答案:

答案 0 :(得分:10)

您可以通过以下方式轻松完成此操作:

<PropertyGroup>
  <DestFolder>..\Copy\</DestFolder>
</PropertyGroup>

<Target Name="CopyContentFiles">
  <Copy SourceFiles="@(Content)"
        DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>

如果你想以后期构建步骤执行它,那么你可以添加AfterTargets =“Build”,例如:

<PropertyGroup>
  <DestFolder>..\Copy\</DestFolder>
</PropertyGroup>

<Target Name="CopyContentFiles" AfterTargets="Build">
  <Copy SourceFiles="@(Content)"
        DestinationFiles="@(Content->'$(DestFolder)%(RelativeDir)%(Filename)%(Extension)')"/>
</Target>

答案 1 :(得分:1)

我使用Web部署功能打包所有内容文件,然后我可以使用Web部署与站点同步或使用xcopy或更确切地说RoboCopy,如果Web部署不是一个选项。

RoboCopy任务包含在MSBuild Community Tasks中。

<PropertyGroup>
    <Configuration>Release</Configuration>
    <PackageDir>$(MSBuildProjectDirectory)\obj\$(Configuration)\Package\PackageTmp</PackageDir>
    <ServerPath>\\server\path</ServerPath>
    <MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\...</MSBuildCommunityTasksPath>
</PropertyGroup>    

<ItemGroup>
    <Project Include="WebApplication.csproj"/>
</ItemGroup>

<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />

<Target Name="Deploy">
    <MSBuild Projects="@(Project)" Targets="Build;Package" Properties="Configuration=$(Configuration)"/>
    <RoboCopy
        SourceFolder="@(PackageDir)"
        DestinationFolder="$(ServerPath)"
        Subdirectories="true"
        Mirror="true"
        />
</Target>

答案 2 :(得分:0)

Sayed的回答对我不起作用,因为它还保留了原始的父目录。我使用了以下更改版本,它工作得很漂亮,更优雅!

<PropertyGroup>
  <DestFolder>..\Copy\</DestFolder>
</PropertyGroup>

<Target Name="CopyContentFiles">
  <Copy SourceFiles="@(Content)"
        DestinationFiles="$(DestFolder)\%(RecursiveDir)"/>
</Target>