Проблема
- У меня есть куча пользовательских файлов в проекте visual studio 2010.
- Мне нужно запустить инструмент для этих пользовательских файлов, когда они меняются.
- Инструмент генерирует файлы .h, входящие в состав существующих файлов .cpp.
- Я хочу, чтобы инструмент выполнялся как часть процесса сборки.
- Он должен запускаться из визуальной студии, но в идеале может также выполняться как часть процесса msbuild.
Существующие субстандартные решения
В каждом файле каждый раз, когда я его добавляю, я могу перейти к настройкам файла, установить тип элемента в Custom Build Tool, а затем в диалоговом окне Custom Build Tool, установить параметры командной строки, установить (hardcoded) выходов и установить (жестко закодированные) дополнительные зависимости.
Очевидно, что это плохое решение, потому что оно является нетривиальным и подверженным ошибкам количеством работы при каждом добавлении нового файла настраиваемого типа.
Желаемое решение
Я установил визуальную студию, которая для любого файла расширения .foo запускает tool bar.exe, когда файл .foo изменяется, прежде чем компилирует код CPP.
Вещи, которые я предпринял
Исходя из этого: http://msdn.microsoft.com/en-us/library/3e889s84(v=vs.100).aspx Я попытался создать файл .targets и .xml. Однако я не могу узнать, как создать новый тип элемента, чтобы он отображался в визуальной студии, и я не могу понять, как сделать его магическим образом применимым к каждому файлу типа .foo. Кроме того, я не понял, как в любом случае это связано с тем, что описывает действие вызова моего инструмента bar.exe.
Я попытался выполнить поиск по всем файлам xml/target в visual studio, чтобы отслеживать существующие типы элементов и определять, как они преобразуются в фактические действия сборки. Он всегда заканчивается на стене ItemType, где есть куча, описанная в ProjectItemsSchema, но я не могу найти, где они реализованы, или как я могу реализовать их самостоятельно.
Документация MSDN была полной неудачей, и я думаю, что я читал каждую потенциально связанную страницу десять раз, но безрезультатно.
В visual studio 2008 у меня была такая работа с файлом .rules, который выглядел так:
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Foo Build Rules"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="FooBuild"
DisplayName="FooGen"
CommandLine="..\..\tools\FooGen.exe [inputs]"
Outputs="$(InputName).h"
AdditionalDependencies="*.foo"
FileExtensions="*.foo"
ExecutionDescription="Generating Foos..."
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
Однако в 2010 году эта функциональность устарела, и мне не удалось выяснить, как ее реплицировать с помощью новой системы.
Справка