Msbuild скопировать в несколько мест на основе списка параметров назначения? - PullRequest
7 голосов
/ 29 мая 2009

У меня есть каталог, который я хочу скопировать в несколько мест.

Скажи, что у меня

  • Home.aspx

Я хочу скопировать его на

  • а / Home.aspx
  • Защита / Home.aspx
  • ГХИ / Home.aspx

поэтому два вопроса для меня:

  • Как мне определить список abc, def, ghi?
  • Как мне выполнить задачу копирования с каждым элементом этого списка?

Ответы [ 4 ]

9 голосов
/ 09 июня 2009

Вот фактический пример, который я собрал, который показывает то, что вы искали:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Test" ToolsVersion="3.5">

  <!--Declare an ItemGroup that points to your file you want to copy.-->
  <ItemGroup>
    <ItemToCopy Include=".\Home.aspx" />
  </ItemGroup>

  <!--Declare an ItemGroup that points to your destination Locations-->
  <ItemGroup>
    <DestLocations Include=".\abc\home.aspx" />
    <DestLocations Include=".\def\home.aspx" />
    <DestLocations Include=".\ghi\home.aspx" />
  </ItemGroup>

  <Target Name="CopyFiles">
    <!--Run the copy command to copy the item to your dest locations-->
    <!--This is where the magic happens.  The % sign before the DestLocations reference says to use
    Batching.  So Copy will be run for each unique FullPath MetaData in the DestLocations ItemGroup.-->
    <Copy SourceFiles="@(ItemToCopy)" DestinationFolder="%(DestLocations.FullPath)" />
  </Target>
</Project>
2 голосов
/ 01 июня 2009

Концепция, которая вас заинтересует, известна как Batching .

Я описал этот точный сценарий в своем блоге на http://www.sedodream.com/PermaLink,guid,5f1e0445-ce3d-4052-ba80-42fd19512d42.aspx

Вот текст этой записи в блоге, вы можете скачать упомянутые файлы по ссылке выше.


Сегодня кто-то рассказывал мне о сотруднике, у которого были проблемы с MSBuild. Он сказал мне, что пытается скопировать набор файлов на набор разных серверов. Но проблема заключалась в том, что он не знал, как этого добиться, не выполняя несколько вызовов задачи «Копировать». Я сказал ему, что он может добиться этого с помощью MSBuild Batching. Пакетирование - это процесс выполнения задачи (или цели) для набора элементов (пакетов) за один раз. Партия также может включать один элемент. Таким образом, в этом сценарии нам нужно выполнить копирование один раз для каждого сервера, на котором он хотел развернуть. Я создал простой файл msbuild, который демонстрирует это двумя разными способами. Первый способ использует пакетное задание, которое можно увидеть в цели теста. А другой использует группировку Target, что можно увидеть в цели DoItCore. Я также создал чистую цель, которая не имеет ничего общего с группированием.

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

      <ItemGroup>
            <SourceFiles Include="*.txt"/>
            <Dest Include="One;Two;Three;Four;Five"/>
      </ItemGroup>

      <Target Name="Test">
            <Copy SourceFiles ="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
            <Message Text="Fullpath: %(Dest.FullPath)"/>
      </Target>


      <!-- These targets demonstrate target batching -->
      <Target Name="DoIt" DependsOnTargets="DoItCore"/>
      <Target Name="DoItCore" Inputs="@(SourceFiles)" Outputs="%(Dest.FullPath)">
            <Copy SourceFiles="@(SourceFiles)" DestinationFolder="%(Dest.FullPath)"/>
      </Target>


      <!-- This will clean up the files -->
      <Target Name="Clean">
            <CreateItem Include="%(Dest.FullPath)\**\*">
                  <Output ItemName="FilesToDelete" TaskParameter="Include"/>
            </CreateItem>
            <Delete Files="@(FilesToDelete)"/>
      </Target>
</Project>

Пакетная обработка - это сложная тема MSBuild, которой определенно пренебрегают. Я должен признать, что я виноват в том, что сам не написал об этом достаточно. Есть несколько хороших ресурсов для пакетирования, они перечислены ниже.


Вот некоторые другие записи блога, которые я опубликовал.

Спасибо, Сказал Ибрагим Хашими

Моя книга: Внутри Microsoft Build Engine: Использование MSBuild и Team Foundation Build

0 голосов
/ 31 мая 2009

Имейте группу предметов, в которой вы строите этот список мест назначения (" abc ... и т. Д.). Затем вызовите задачу копирования с этим списком (@Destination).

Я уверен, что вы найдете множество примеров, если будете искать его. http://keithhill.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=cat%3dMSBuild

0 голосов
/ 29 мая 2009

Вам действительно лучше делать это самостоятельно как учебное упражнение, а не рассматривать MSBUILD как волшебную коробку. Эта статья от Патрика Смаккья дает вам большинство задействованных техник.

...