首页 > 解决方案 > MSBuild:如何递归复制到项目的某些父文件夹

问题描述

我有以下项目结构

SolutionDir
  -src
    -Feature
    |---Feature.A
    |-----code
    |-------ViewA
    |---------FileA.cshtml
    |---Feature.B
    |-----code
    |-------ViewB
    |---------FileB.cshtml

我希望将其复制到以下结构中的 dest 目录

-OutputDir
|--code
|----ViewA
|------ViewA.cshtml
|----ViewB
|------ViewB.cshtml

我在 .csproj 中使用以下脚本

<Target Name="AfterBuild">
<ItemGroup>
  <FeatureViewFiles 
    Include="$(SolutionDir)src\Feature\Feature.*\code\**\*.cshtml" />
</ItemGroup>
<Copy 
  SkipUnchangedFiles="true" 
  SourceFiles="@(FeatureViewFiles)" 
  DestinationFolder="OutputDir\code\%(RecursiveDir)%(Filename)%(Extension)" />
</Target>

现在因为在我Include的通配符中从Feature.*RecursiveDir指令输出Feature.A\code\ViewA\,而我真正想要的是它从文件夹下开始复制文件夹结构code。知道我将如何实现这一目标吗?

标签: c#.netvisual-studiomsbuild

解决方案


抱歉,恐怕答案是否定的。

据我所知,这是复制任务的预期行为。如果您在 Feature.* 中使用通配符,它​​将不会从 ViewX 中选择结构。只有指定 Feature.A 或 Feature.B,复制任务才能按预期工作。但我认为这不是你想要的,所以我认为复制任务不能满足你对这个问题的需求。

除了 Copy 任务,还有一个 Exec 任务,您可以在其中指定命令。它的工作方式类似于使用命令行 cmd.exe。因此,如果有任何命令或批处理文件可以完成这项工作,您可以使用Exec 任务来调用它们。但是对于复制任务,目前它不支持指定父文件夹级别的行为:(

另外:我尝试了copy,xcopy但没有运气。也许您可以尝试robocopy或任何其他工具。如果它们可以在命令行中工作,那么您可以使用 exec 命令将它们包含在您的构建目标中。


推荐阅读