Событие пользовательской сборки Visual Studio всегда выполняется
Я использую компилятор odb в качестве пользовательского инструмента сборки. Инструмент сборки всегда выполняется, даже если входной файл не меняется.
Командная строка:
odb -Ic:\menuplan\src\ingredient -o c:\menuplan\src\ingredient
-d mysql --hxx-prologue "#include \"odb/traits.hxx\"" --generate-query
--generate-schema --schema-format separate
c:\menuplan\src\ingredient\ing_odb_category.hpp`
Входной файл:ing_odb_category.hpp
,
Выходы:
ing_odb_category-odb.hxx;ing_odb_category-odb.ixx;ing_odb_category-odb.cxx;ing_odb_category-schema.cxx
Дополнительные зависимости:ing_odb_category.hpp
Описание:odb ing_odb_category.hpp
Вывод из Visual Studio 2010:
2>------ Build started: Project: vs_2010, Configuration: Debug Win32 ------
2> odb ing_odb_category.hpp
odb
инструмент берет ing_odb_category.hpp
в качестве входных данных и производит ing_odb_category-odb.hxx
, ing_odb_category-odb.ixx
,ing_odb_category-odb.cxx
,ing_odb_category-schema.cxx
файлы.
Я могу построить решение много раз подряд, и пользовательское событие сборки всегда будет выполняться, даже если ing_odb_category.hpp
файл никогда не меняется.
Как я могу заставить Visual Studio выполнять пользовательскую сборку только в случае изменения файла заголовка?
Из файла vcxproj:
<CustomBuild Include="..\ing_odb_category.hpp">
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">odb -Ic:\menuplan\src\ingredient -o c:\menuplan\src\ingredient -d mysql --hxx-prologue "#include \"odb/traits.hxx\"" --generate-query --generate-schema --schema-format separate c:\menuplan\src\ingredient\ing_odb_category.hpp</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug_Static_Unicode|Win32'">odb -Ic:\menuplan\src\ingredient -o c:\menuplan\src\ingredient -d mysql --hxx-prologue "#include \"odb/traits.hxx\"" --generate-query --generate-schema --schema-format separate c:\menuplan\src\ingredient\ing_odb_category.hpp</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">odb ing_odb_category.hpp</Message>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug_Static_Unicode|Win32'">odb ing_odb_category.hpp</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">ing_odb_category-odb.hxx;ing_odb_category-odb.ixx;ing_odb_category-odb.cxx;ing_odb_category-schema.cxx</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug_Static_Unicode|Win32'">ing_odb_category-odb.hxx;ing_odb_category-odb.ixx;ing_odb_category-odb.cxx;ing_odb_category-schema.cxx</Outputs>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">ing_odb_category.hpp</AdditionalInputs>
</CustomBuild>
Среда:
- Visual Studio 2010
- Windows 7 - 64 бит
1 ответ
Visual Studio всегда создавала файлы, потому что говорила, что они не существуют.
Использование статьи по ведению журнала проекта Visual Studio, особенно запуск DebugView, показал, что Visual Studio использует другой путь для зависимостей. Я не указал путь к выходным файлам и зависимостям, поэтому пытался найти их в каталоге проекта по умолчанию.
Кроме того, Visual Studio ожидает только один выходной файл, в соответствии со статьей Specifying Custom Build Tools. Я поставлял все выходные имена файлов.
Резюме
В окне Custom Build Tool:
- Должен быть только один выходной файл.
- Дополнительные выходные файлы перечислены в
Additional Dependencies
слот. - Все выходные файлы должны иметь префикс с указанием пути их расположения, относительный или абсолютный.
Полезные средства отладки процесса сборки можно найти в Visual Studio Project Logging
статья, особенно DebugView
приложение.