Программная рекурсивная копия MSBuild с подстановочными знаками - PullRequest
3 голосов
/ 29 ноября 2011

Я создаю задачу MSBuild v4, для которой необходимо вызвать задачу копирования для рекурсивного копирования некоторых файлов (без выравнивания структуры каталогов в месте назначения).

Я придумала:

var copy = new Microsoft.Build.Tasks.Copy
{
    BuildEngine = this.BuildEngine,
    SourceFiles = new ITaskItem[] { new TaskItem(@"C:\source\**\*.foo") },
    DestinationFolder = new TaskItem(@"c:\dest\\")
};
copy.Execute();

, но получаю сообщение об ошибке «Не удалось скопировать C: \ source \ ** \ *. Foo в c: \ dest \ * - Недопустимые символы в пути»

Кажется, что нетбыть большой онлайн-помощью для прагматического вызова, и вычеркнули пробел.Есть идеи?

Спасибо

Джон

Ответы [ 3 ]

11 голосов
/ 30 ноября 2011

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

<ItemGroup>
  <x Include="c:\source\**\*.foo" />
</ItemGroup>
<Copy SourceFiles="@(x)" DestinationFolder="c:\dest\%(RecursiveDir)" />

Однако, поскольку задача копирования, по-видимому, обрабатывает SourceFiles и DestinationFiles как ассоциативный массив(каждый из типов ITaskItem []), мы просто выполнили рекурсивный спуск и создали эти два массива вручную, прежде чем выполнить его

2 голосов
/ 29 ноября 2011

Проблема в том, что при написании одного и того же в XML вы не передали бы путь с подстановочными знаками непосредственно в свойство SourceFiles.Вы бы создали ItemGroup и , а затем , передав его в свою задачу.

Насколько я знаю, это ItemGroup делает маску подстановки, поэтому в C # этодо вас, чтобы вручную создать массив ITaskItem, который содержит полный список элементов, которые вы хотите скопировать.

Если вы можете, создайте ItemGroup, который вы передадите своей задаче, которая, в свою очередь,передает его Copy.

1 голос
/ 29 ноября 2011

Вы можете сделать это, просто используя задачу MSBuild Copy. Вам не нужно писать новое задание для этого.

<Copy SourceFiles="@(SourceFiles)"
      DestinationFiles="$(DestinationFolder)\%(RecursiveDir)%(Filename)%(Extension)"
      ContinueOnError="false"/>

Проверить все доступные Метаданные MSBuild .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...