В Visual Studio можно ли заставить один файл запускать другой инструмент?(в этом случае используется Xsd2Code) - PullRequest
7 голосов
/ 17 февраля 2012

Я пытаюсь разобраться, если при использовании пользовательского инструмента в Visual Studio возможно изменение содержимого одного файла, вызвать пользовательский инструмент другого.

Мой сценарийthis:

В проекте Visual Studio C # у меня есть XML-схема «master.xsd», которая включает несколько других xsd-файлов.Я использую Xsd2Code Visual Studio Custom Tool для создания .cs из схемы.Это прекрасно работает при изменении самого master.xsd, но я бы хотел, чтобы пользовательский инструмент запускался с файлом master.xsd при изменении одного из других xsds.

Есть ли способ, когда один файл вызывает другой пользовательскийИнструмент?

[РЕДАКТИРОВАТЬ - более подробно о том, почему я изучаю использование специального инструмента для этого]

В настоящее время у нас есть файл GenerateFiles.bat, который вызываетXsd2Code из командной строки для генерации полей кода из схем (как предложено MattDavey ниже).Это работает, просто слишком медленно.

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

1 Ответ

4 голосов
/ 17 февраля 2012

Я часто использую Xsd2Code таким образом, но мой подход заключается в добавлении события предварительной сборки, которое вызывает командную строку Xsd2Code и восстанавливает xml в каждой сборке.

Мое событие перед сборкой выглядит так:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs /platform Net40 /collection Array  /sc+ /ap+ /if- /xa+

В вашем случае вы могли бы выполнить этот шаг предварительной сборки только на главном xsd (который я предполагаю, xsd: импортирует другие схемы), или вы можете запустить команду для каждого из ваших файлов схемы отдельно.

Преимущество этого состоит в том, что, если я изменяю схему XSD, я получаю очень полезные ошибки времени компиляции:)

Надеюсь, что это дает вам некоторые идеи!

EDIT

Я потратил некоторое время на размышления о проблеме, которую вы выдвинули в отношении времени сборки, и изменил сценарий предварительной сборки следующим образом:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs.temp /platform Net40 /collection Array  /sc+ /ap+ /if- /xa+

fc $(ProjectDir)Api\Schemas\MySchema.cs  $(ProjectDir)Api\Schemas\MySchema.cs.temp

if errorlevel 1 copy $(ProjectDir)Api\Schemas\MySchema.cs.temp $(ProjectDir)Api\Schemas\MySchema.cs /Y

del $(ProjectDir)Api\Schemas\MySchema.cs.temp

Таким образом, Xsd2Code теперь генерирует исходный код во временный файл, который перезаписывает существующий файл .cs, только если он отличается. Это должно означать, что если .xsd вообще не изменился, то и сгенерированный .cs:)

не изменится.

Вы по-прежнему получаете удовольствие от запуска xsd2code, но вы не принимаете хит msbuild, перестраивая всю цепочку проектов, если сгенерированный исходный код был тем же.

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