MSBUILD: Как преобразовать данные XML-файла в Предметы? - PullRequest
2 голосов
/ 07 января 2012

Я написал несколько скриптов MSBuild, которые позволяют мне создавать несколько сотен проектов.Одним из требований является копирование файлов в каталог сборки.У меня есть файл XML, который содержит список того, что нужно скопировать и куда его нужно скопировать.Этот XML-файл является просто ItemGroup, который я импортировал в основной проект, и все отлично работает.

Моя единственная проблема с этим - мой XML-файл со всеми элементами огромный (у меня есть сотни каталогов для копирования)!Это связано с тем, что все элементы должны иметь прикрепленные метаданные, что означает, что каждое объявление копии должно иметь 3 строки кода и три элемента XML.т.е.

<copy_to_build Include="$(FooDir)/BAZ/CoreDataFiles/*">
  <Destination>$(BuildDir)//BAZ/</Destination>
</copy_to_build>

Это в три раза превышает размер моего сценария копирования и означает, что его сложно поддерживать.

Хорошо, поэтому я преобразовал свой XML в этот формат в другом файле:

<copy_to_build Source="$(FooDir)/BAZ/CoreDataFiles/*" Destination="$(BuildDir)//BAZ/" />

Что более кратко, поскольку в каждой команде копирования содержится один элемент xml.Гораздо легче читать.

Единственная проблема с этим, я не могу использовать их как «Предметы» в MSBuild, потому что метаданные отсутствуют, и Предметы НЕ МОГУТ иметь атрибут «Назначение».

Итак, я написал инструмент для «преобразования» моего краткого XML обратно в подробный формат MSBuild.Затем я столкнулся с дилеммой, как вернуть этот преобразованный XML-файл обратно в мой файл «проекта».Я обнаружил, что импорт должен выполняться на уровне проекта: поэтому я не могу «преобразовать» мой xml-файл внутри задачи или цели.Это означает, что файл должен быть готов ко времени обработки импорта.Следовательно, xml-файл не может быть переоценен внутри моей Target ... Так что, очевидно, мне нужно «преобразовать» мой xml-файл, прежде чем даже вызвать MSBuild из командной строки.Который добавляет сложные шаги в моем процессе сборки.

Итак, мой последний вопрос: как мне прочитать мои (одноэлементные) данные XML-файла и преобразовать их в (трехэлементные) элементы в цели или задаче?

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 23 января 2013

Это не правильный способ решения вашей проблемы (, если я не понимаю проблему ). Забудьте попытки генерировать элементы MSBuild XML на лету. Вместо этого вам следует сделать следующее.

  1. Создайте свой XML-файл в любом формате, который соответствует вашим потребностям
  2. Создайте пользовательскую задачу MSBuild, которая читает файл XML и выдает ItemGroup
  3. Добавить задачу в файл проекта и вызвать ее

Создать задачу MSBuild довольно просто. С MSBuild 4.0+ вы даже можете определить всю задачу в файле MSBuild, чтобы вам не приходилось беспокоиться о ее компиляции и сборке. Для получения дополнительной информации об этом смотрите Inline Tasks .

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

1 голос
/ 26 февраля 2013

Я обнаружил, что MSBuild Extension Pack чрезвычайно полезен для работы с произвольными файлами XML, в частности с XmlFile и XmlTask.Мы используем такие вещи для управления / размещения изменений в базе данных.

Тем не менее, мое предложение только в ответ на вопрос "Как мне преобразовать XML в элементы с помощью MSBuild?"@ Сказание Сайеда о том, подходит ли оно для вашей проблемы, - это совсем другой вопрос, о котором стоит подумать.

1 голос
/ 07 января 2012

Попробуйте использовать XSLT-преобразование для вашего входного одноэлементного XML-файла, чтобы перевести его в трехэлементный XML-файл, используемый в ваших скриптах MSBuild. Здесь - хорошая статья о том, как использовать преобразования XSLT в MSBuild.

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