构建脚本,将文件从各种源文件夹复制到各种目标文件夹



基本要求是将不同解决方案/项目目录中的各种文件和文件夹复制到单个build_output文件夹(/subfolders(中。

目前,我正在使用Robocopy命令执行此操作。唯一的问题是我的脚本太长了,仅仅使用多个Robocopy命令。

<Copy SourceFiles="$(Docs)Manual.pdf" DestinationFolder="$(BuildPath)Help"/>
<RoboCopy Source="$(Web1)" Destination="$(BuildPath)" Files="*.aspx" Options="/E"/>
<RoboCopy Source="$(Web1)Images" Destination="$(BuildPath)Images" Files="*.jpg;*.png" Options="/E"/>
<RoboCopy Source="$(Web2)Images" Destination="$(BuildPath)Images" Files="*.jpg;*.png" Options="/E"/>
<!--- 100s of such RoboCopy & Copy commands (note that in last two commands i need to copy from different sources to same destination -->
  1. 如何在真实的企业应用程序中实现此作业,以便构建脚本简洁明了
  2. 是我下面的思考方式来解决的。如果是的话,有人能简单地使用MSBuild或CommandScript为我提供示例步骤吗。(可以自由使用任何MSBuild扩展(
    • 定义所有源文件夹、文件类型(可以是xyz.png/.png/.*(和目标路径的映射
    • 使用上述映射,使用单个目标或任务复制文件(Robocopy(
  3. 有没有其他更好的方法来解决这个问题

见解/解决方案???

我正是这样做的,以暂存构建输出,供安装程序构建获取。我有一个用于一致处理的自定义目标文件,并且有一些msbuild属性文件,其中包含描述需要完成的项组。

<ItemGroup Label="AcmeComponent1Payload">
<FileToHarvest Include="$(SourceRoot)AcmeProjectsServerManager$(Configuration)***;
$(SourceRoot)LibrarySQLServerCompact***;
$(SourceRoot)Utility ProjectsPropertyDataValidatorPropertyDataValidatorbin$(Configuration)PropertyDataValidator.*"
Exclude="$(SourceRoot)Server Manager ProjectsAcmeServerManager$(Configuration)IntegrationTests.*;
$(SourceRoot)Server Manager ProjectsAcmeServerManager$(Configuration)**Microsoft.Practices.*.xml;
$(SourceRoot)Server Manager ProjectsAcmeServerManager$(Configuration)obj***;
$(SourceRoot)Server Manager ProjectsAcmeServerManager$(Configuration)**Microsoft.VisualStudio.*;
$(SourceRoot)Server Manager ProjectsAcmeServerManager$(Configuration)**Microsoft.Web.*;
$(SourceRoot)Utility ProjectsPropertyDataValidatorPropertyDataValidatorbin$(Configuration)PropertyDataValidator.xml">
<Group>AcmeServerManager</Group>
<SubDir>Utilities</SubDir>
</FileToHarvest>
</ItemGroup>

自定义目标文件具有处理它的功能。

<Target Name="CopyFiles">
<Copy Condition="@(FileToHarvest)!=''"
SourceFiles="@(FileToHarvest)"
DestinationFiles="@(FileToHarvest->'$(OutputPath)%(Group)%(SubDir)%(RecursiveDir)%(Filename)%(Extension)')"
OverwriteReadOnlyFiles="true"
SkipUnchangedFiles="true" />
</Target>

您可以根据需要使属性文件变得简单或复杂。我使用多个通配符,并使用通配符将它们导入到项目文件中。

谢谢@daughey,我的第一部分工作了,我需要从不同的源复制到同一个目的地。

<!--Declare an ItemGroup that points to source Locations-->
<ItemGroup>
<ItemToCopy Include="$(Web1)Audit"/>
<ItemToCopy Include="$(Utilities)Service"/>
<ItemToCopy Include="$(Web1)NET"/>
</ItemGroup>
<!--Declare an ItemGroup that points to destination Locations-->
<ItemGroup>
<DestLocations Include="$(BuildPath)" />
</ItemGroup>
<Target Name="CopyFiles">
<!-- Run the copy command to copy the item to your dest locations-->
<!-- The % sign says to use Batching. So Copy will be run for each unique source ItemToCopy(s) in the DestLocation.-->
<RemoveDir Directories="$(BuildPath)"/>
<Message Importance="high" Text="Deploy folder is $(BuildPath)"/>
<RoboCopy Source="%(ItemToCopy.FullPath)" Destination="$(BuildPath)" Files="*.dll"/>
</Target>

在为任务批处理的项目元数据而苦苦挣扎之后,第二部分的工作也很好。场景:将文件从源目录列表复制到各自子文件夹上的输出目录

  • $(Web1(\Audit*.dll=>$(BuildPath(\Audit*.dll

  • $(实用程序(\Service*.jpg=>$(BuildPath(\Utilities \Service*..jpg

解决方案

<!--Modify an ItemGroup with metadata-->
<ItemGroup>
<ItemToCopy Include="$(Web1)Audit">
<ToPath>$(BuildPath)Audit</ToPath>
<FileType>*.dll</FileType>
</ItemToCopy>
<ItemToCopy Include="$(Utilities)Service">
<ToPath>$(BuildPath)UtilitiesService</ToPath>
<FileType>*.jpg;*.bmp</FileType>
</ItemToCopy>
</ItemGroup>
<Target Name="CopyBatch">
<RoboCopy Source="%(ItemToCopy.Identity)" Destination="%(ItemToCopy.ToPath)" Files="%(ItemToCopy.Filetype)"/>
</Target>

最新更新