MSBuild中递归复制的文件夹被错误地复制到一个文件夹

时间:2016-02-10 14:32:08

标签: .net msbuild target msbuild-target

我正在编写MSBuild目标/ xml配置文件。

假设我的项目源文件夹中有两个文件夹要复制。我想复制这些文件夹(及其内容),并忽略其他文件夹。

下面的规范是复制正确的文件,但它们都只是转储到一个文件夹中。两个顶级文件夹(bin和obj)丢失,其内容只合并到一个文件夹中。

我想基本上将这两个文件夹复制到新的顶级文件夹中,就像它们及其内容一样。

脚本

<Target Name="Package" DependsOnTargets="Build">
    <Message Text="Copying."></Message>
    <ItemGroup>
        <PackagedFiles Include="$(PipelineFolder)MyFolder\bin\**;
                                $(PipelineFolder)MyFolder\obj\**" />
    </ItemGroup>

    <MakeDir Directories="$(PipelineFolder)CopiedFolder" />
    <Copy SourceFiles="@(PackagedFiles)" DestinationFolder="$(PipelineFolder)CopiedFolder\%(RecursiveDir)%(Filename)%(Extension)" />

</Target>

复制顶级文件夹的最简单方法是什么,我猜PackagedFiles中的通配符指向这些文件夹中的所有内容。我无法从工作目录上方的文件夹中执行此操作,因为我将复制所有其他文件夹(不仅仅是我想要的文件夹,bin和obj)。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用批处理。第一个目标定义要包含的文件夹,第二个目标首先定义具有使用DependsOnTargets属性的文件夹。 Outputs属性告诉MSBuild使用该目标的批处理。

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

<Target Name="DefinePackageFolders">
    <ItemGroup>
        <PackageFolders Include="bin"/>
        <PackageFolders Include="obj"/>
    </ItemGroup>
</Target>

<Target Name="CopyPackageFolders" DependsOnTargets="DefinePackageFolders" Outputs="%(PackageFolders.Identity)">
    <Message Text="Copying %(PackageFolders.Identity)" />
    <PropertyGroup>
        <TargetSubFolder>%(PackageFolders.Identity)</TargetSubFolder>
    </PropertyGroup>
    <ItemGroup>
        <Files Include="$(PipelineFolder)MyFolder\%(PackageFolders.Identity)\**" />
    </ItemGroup>
    <MakeDir Directories="$(PipelineFolder)CopiedFolder\%(PackageFolders.Identity)" />
    <Copy SourceFiles="@(Files)" DestinationFiles="$(PipelineFolder)CopiedFolder\$(TargetSubFolder)\%(RecursiveDir)%(Filename)%(Extension)" />
</Target>

</Project>

注意:您必须将%(PackageFolders.Identity)包装到单独的属性中,因为您无法在DestinationFiles属性中使用两个不同的项目组。

假设您有以下输入数据:

C:\PipelineFolder\MyFolder\bin\bin.txt
C:\PipelineFolder\MyFolder\obj\obj.txt

我们假设提供的脚本位于C:\test.proj然后您将使用给定的PipelineFolder属性调用脚本。

C:\> msbuild test.proj /p:PipelineFolder=C:\PipelineFolder\

生成的文件集将是:

C:\PipelineFolder\CopiedFolder\bin\bin.txt
C:\PipelineFolder\CopiedFolder\obj\obj.txt