我正在编写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)。
感谢。
答案 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