Сценарий сборки для копирования файлов из разных исходных папок в разные целевые папки - PullRequest
0 голосов
/ 29 ноября 2018

Основным требованием является копирование различных файлов и папок из разных каталогов решений / проектов в одну папку build_output (/ вложенные папки).

В настоящее время я выполняю эту операцию с использованием 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. Есть ли какой-нибудь другой лучший способ решить эту проблему?

Выводы / Решение ???

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Спасибо @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

  • $ (Утилиты) \ Сервис * .jpg => $ (BuildPath) \ Утилиты \ Сервис * .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)\Utilities\Service</ToPath>
        <FileType>*.jpg;*.bmp</FileType>
    </ItemToCopy>
</ItemGroup>

<Target Name="CopyBatch">
    <RoboCopy Source="%(ItemToCopy.Identity)" Destination="%(ItemToCopy.ToPath)" Files="%(ItemToCopy.Filetype)"/>
</Target>
0 голосов
/ 29 ноября 2018

Я делаю именно такие вещи, чтобы подготовить выходные данные сборки для сборки сборщиком сборки.У меня есть файл пользовательских целей для последовательной обработки, и у меня есть несколько файлов свойств msbuild с группами элементов, описывающими, что необходимо сделать.

  <ItemGroup Label="AcmeComponent1Payload">
    <FileToHarvest Include="$(SourceRoot)AcmeProjects\ServerManager\$(Configuration)\**\*;
                            $(SourceRoot)Library\SQLServerCompact\**\*;
                            $(SourceRoot)Utility Projects\PropertyDataValidator\PropertyDataValidator\bin\$(Configuration)\PropertyDataValidator.*"
                   Exclude="$(SourceRoot)Server Manager Projects\AcmeServerManager\$(Configuration)\IntegrationTests.*;
                            $(SourceRoot)Server Manager Projects\AcmeServerManager\$(Configuration)\**\Microsoft.Practices.*.xml;
                            $(SourceRoot)Server Manager Projects\AcmeServerManager\$(Configuration)\obj\**\*;
                            $(SourceRoot)Server Manager Projects\AcmeServerManager\$(Configuration)\**\Microsoft.VisualStudio.*;
                            $(SourceRoot)Server Manager Projects\AcmeServerManager\$(Configuration)\**\Microsoft.Web.*;
                            $(SourceRoot)Utility Projects\PropertyDataValidator\PropertyDataValidator\bin\$(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>

Вы можете сделать файл свойств настолько простым или сложным, насколько захотите.Я использую несколько и импортирую их в файл проекта с использованием подстановочных знаков.

...