В Visual Studio можно сделать один файл запустить другой пользовательский инструмент? (В этом случае с использованием xsd2code)

StackOverflow https://stackoverflow.com/questions/9325165

Вопрос

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

Мой сценарий таково:

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

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

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

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

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

Это было полезно?

Решение

Я часто использую 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, я получаю очень полезные ошибки времени компиляции :)

Надеюсь, это даст вам несколько идей!

РЕДАКТИРОВАТЬ

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

$(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, которая восстанавливает целую цепь проектов, если сгенерированный источник был таким же ..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top