У меня есть проект VS 2015 C ++ с шагами PreBuild и PostBuild.
Кроме того, у меня есть пользовательская цель, добавленная в проект с помощью «Зависимости сборки -> Настройка сборки». Custom Target запускает скрипт Perl, который запускает файлы сборки nmake с помощью Intel Compiler. Пользовательская цель всегда работает. В частности, скрипт Perl всегда запускается, пока nmake проверяет изменения и предотвращает сборку, если входные файлы не изменились.
Вызов пользовательской цели приводит к запуску PreBuild и PostBuild, даже если пользовательская цель не выдает и создает новый вывод (она запускалась, но ничего не делала, кроме проверок).
Я хочу запретить запуск PreBuild и PostBuild, если моя пользовательская цель не выдает никакого нового вывода. До сих пор я не нашел способ сделать это.
Другой вариант — запретить запуск пользовательской цели, если источники не изменились. К сожалению, файлы, созданные компилятором Intel, помечены как «Исключить из сборки» и, следовательно, не запускают пользовательскую цель. Я пытался определить ввод & Вывод для задачи, выполняемой пользовательской целью без удачи.
Любая помощь будет высоко оценена!
Убедитесь, что ваши пользовательские цели имеют атрибут Inputs и Outputs, который правильно описывает, какие файлы будут использоваться в качестве входных данных, а какие — в результате. MsBuild будет использовать временную метку для этих файлов, чтобы решить, действительно ли вы что-то изменили. Временная метка в этих файлах должна быть старше, чем файл, который будет сгенерирован как вывод от цели, так решает MsBuild.
Пример:
<Target Name="Custom"Inputs="@(CSFile)"Outputs="hello.exe">
<Csc
Sources="@(CSFile)"OutputAssembly="hello.exe"/>
</Target>
Смотрите также:
Вы можете использовать преобразования для сопоставления ввода с выводом, если между ними есть логическая связь:
<Target Name="Convert"Inputs="@(TXTFile)"Outputs="@(TXTFile->'%(Filename).content')">
<GenerateContentFiles
Sources = "@(TXTFile)">
<Output TaskParameter = "OutputContentFiles"ItemName = "ContentFiles"/>
</GenerateContentFiles>
</Target>
Не полагайтесь на BeforeTargets и AfterTargets и никогда не полагайтесь на PreBuildEvent
поскольку эта цель сама по себе не имеет никаких входов или выходов и, следовательно, всегда срабатывает, они являются довольно старыми конструкциями, происходящими из эпохи 2003 года, вместо этого переопределяют BuildDependsOn
и введите свою цель в цепочку.
Пример:
<PropertyGroup>
<BuildDependsOn>
Convert;
$(BuildDependsOn);
</BuildDependsOn>
</PropertyGroup>
Увидеть:
Других решений пока нет …