0

我正在编写一个 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)。

谢谢。

4

1 回答 1

1

您可以为此使用批处理。第一个目标定义要包含的文件夹,第二个目标首先使用 useDependsOnTargets属性定义这些文件夹。该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
于 2016-02-10T16:54:55.273 回答