2011-11-29 2 views
1

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

я придумал:

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: \ источник \ ** \ * Foo к с:. \ Dest \ * - Запрещенные символы в пути'

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

Благодаря

Jon

+0

Если бы это сработало, я думаю, что он бы сплющил вашу структуру папок, это то, что вы хотите? –

+0

Нет, я хочу c: \ source \ a \ b \ c.foo для копирования в c: \ dest \ a \ b \ c.foo - Спасибо, я обновлю вопрос –

+0

, поможет ли вам удалить двойной \\ в c: \ dest \? – oberfreak

ответ

8

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

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

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

0

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

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

Проверьте доступность MSBuild metadata.

+0

Мы создаем нашу собственную задачу C# и хотим использовать Copy from внутри этого. Похоже, что это невозможно, но я не могу ответить на свой вопрос еще на 5 часов из-за ограничений безопасности SO. –

1

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

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

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

+0

Это элементная группа (или, по крайней мере, MSBuild), которая выполняет расширение, и это приводит к тому, что задача Copy вызываться один раз в каталоге –

Смежные вопросы