Справочные элементы в контексте

Я пытаюсь найти способ получить доступ к элементам из контекста без явного объявления ItemGroup.

В настоящее время пытается выполнить задачу копирования:

<Copy SourceFiles="C:\blabla\**\*.*" DestinationFiles="%(?.RecursiveDir)" />

Что я могу использовать вместо "?" выбрать элементы в контексте?

Причина в том, что у меня есть файл проекта MSBuild, созданный с помощью XSLT, и неизвестное количество папок и файлов (некоторые из них имеют другую структуру в целевой папке - в этом случае я намерен использовать другие метаданные вместо RecursiveDir) во входном XML. Можно ли добиться этого без необходимости объявлять множество групп предметов (или группу предметов с большим количеством предметов)?

Я попытался найти это, но все, что я нашел, это сообщения с объявленными группами предметов.


person Parag Doke    schedule 20.09.2012    source источник
comment
Вы хотите ссылаться на метаданные элемента без явного удаления самого элемента, поэтому я сомневаюсь, что вы сможете это сделать. Также для задачи копирования требуется, чтобы SourceFiles имел тип ITaskItem [] (буквально - требуется сбор элементов). Фактически описание задачи копирования в msdn (msdn.microsoft.com/en-us/library /3e54c37h.aspx) есть точный пример, которому вы могли бы следовать, но вы должны объявить группу элементов с предложением вложенных элементов внутри.   -  person Alexey Shcherbak    schedule 25.09.2012
comment
Спасибо, Алексей. Но явное объявление - это именно то, чего я пытался избежать. Исправьте меня, если я ошибаюсь, но мое наблюдение состоит в том, что наличие элемента с большим количеством файлов (огромный набор файлов) замедляет работу MSBuild по сравнению с наборами файлов с меньшим количеством файлов .   -  person Parag Doke    schedule 25.09.2012
comment
Смотря как =). Какие числа вы имеете в виду под огромным набором файлов =). Это правда, что движок msbuild генерирует и оценивает каждую группу элементов в памяти, и, вероятно, огромный набор файлов может привести к увеличению объема памяти. Но msbuild не адаптирован для работы в качестве выбранного вами языка сценариев (даже у PowerShell есть проблемы с 250K + файлами в одном каталоге, в том числе с самим Windows). Если вам просто нужно выполнить копию без доступа к полному мета (кроме рекурсивного каталога) - используйте задачу Exec и вызовите robocopy.exe - он работает ваааай лучше, чем что-либо еще (с учетом доступных из коробки инструментов).   -  person Alexey Shcherbak    schedule 25.09.2012
comment
в качестве дополнения - необходимо протестировать и оценить огромное количество, прежде чем мы объявим, что конкретный инструмент для этого неприемлем. Я думаю, что как только msbuild сможет справиться с большими решениями, он, вероятно, сможет справиться с довольно большими наборами файлов. Это просто вопрос ресурса \ скорости. Но у любого инструмента есть непреодолимые ограничения.   -  person Alexey Shcherbak    schedule 25.09.2012
comment
Расширение Robocopy MSBuild работает немного быстрее. Спасибо за это! Но быстрее всего сработала копия с атрибутом UseHardlinksIfPossible. Набор файлов составляет около 18-19 ГБ на сборку (примерно 20 тыс. Файлов). Я, вероятно, буду использовать UseHardlinksIfPossible с ItemGroup / Item. Еще раз большое спасибо. Я отмечу ваш комментарий о robocopy как полезный.   -  person Parag Doke    schedule 26.09.2012
comment
=) Рад помочь. На самом деле я имел в виду не расширение robocopy, а сам robocopy.exe (en.wikipedia.org/wiki/Robocopy), вы можете легко вызвать его с помощью Exec task. И уж точно непревзойденные жесткие ссылки по скорости копирования =). Но имейте в виду - он будет работать только на одном томе диска (потому что это не настоящая копия, а просто добавление другого имени файла к тому же набору байтов =)). Если вам нужна фактическая копия на другой диск или по сети - robocopy снова засветится =).   -  person Alexey Shcherbak    schedule 26.09.2012
comment
PS: 20k файлов - это далеко от моего определения огромных;) Мы имели дело с ~ 280k-300k маленьких файлов, суммарный объем около 80Gb. В этом раунде победили Powershell для сантехники и robocopy для фактического перемещения битов.   -  person Alexey Shcherbak    schedule 26.09.2012


Ответы (1)


@ Алексей Щербак писал:

Вы хотите ссылаться на метаданные элемента без явного объявления самого элемента, поэтому я сомневаюсь, что вы сможете это сделать. Также для задачи копирования требуется, чтобы исходные файлы были типа ITaskItem[] (буквально - для этого требуется сбор элементов). На самом деле msdn описание задачи копирования содержит точный пример, которому вы могли бы следовать, но вы должны объявить группу элементов с предложением вложенных элементов внутри.

Вы можете задаться вопросом, есть ли у вас элемент с большим количеством файлов, замедляет ли это MSBuild. Ответ: как бывает =). Какие числа вы имеете в виду под огромным набором файлов =). Это правда, что движок MSBuild генерирует и оценивает каждую группу элементов в памяти, и, вероятно, огромный набор файлов может привести к увеличению объема памяти. Но MSBuild не адаптирован для работы в качестве предпочитаемого вами языка сценариев (даже у PowerShell есть проблемы с 250К + файлами в одном каталоге, в том числе в Windows). Если вам просто нужно выполнить копию без доступа к полному мета (кроме рекурсивного каталога) - используйте задачу Exec и вызовите robocopy.exe - он работает как бы лучше, чем что-либо еще (учитывая доступные готовые инструменты).

В качестве дополнения - необходимо протестировать и оценить огромное количество, прежде чем мы объявим, что конкретный инструмент для этого неприемлем. Я думаю, что как только MSBuild сможет работать с большими решениями, он, вероятно, сможет работать с довольно большими наборами файлов. Это просто вопрос ресурса / скорости. Но у любого инструмента есть непреодолимые пределы.

На самом деле я имел в виду не расширение robocopy, а robocopy.exe само en.wikipedia.org/wiki/Robocopy, вы можно легко вызвать его с помощью задачи Exec. И уж точно жесткие ссылки не имеют себе равных по скорости "копирования" =). Но имейте в виду - он будет работать только на одном томе диска (потому что это не фактическая копия, а просто добавление другого имени файла к тому же набору байтов =)). Если вам нужна фактическая копия на другой диск или по сети - robocopy снова засветится =).

PS: 20k файлов - это далеко от моего определения огромных;) Мы имели дело с ~ 280k-300k маленьких файлов, суммарный объем около 80Gb. В этом раунде победили Powershell для сантехники и robocopy для фактического перемещения битов.

person Community    schedule 10.06.2015