1

У меня есть проект VS 2015 C++ с шагами PreBuild и PostBuild.VS 2015 «Build Dependencies -> Build Customization» всегда запускает PreBuild и PostBuild

Кроме того, у меня есть пользовательская цель, добавленная в проект «Build Dependencies -> Build Customization». Пользовательская целевая программа запускает скрипт Perl, который запускает файловые файлы nmake с помощью Intel Compiler. Пользовательская цель всегда работает. В частности, скрипт Perl всегда работает, пока nmake проверяет наличие изменений и предотвращает создание, если входные файлы не изменились. Вызов пользовательской цели заставляет PreBuild и PostBuild запускаться, даже если пользовательская цель не создавала и не выводила новый результат (она выполнялась, но ничего не делала, кроме проверок).

Я хочу предотвратить запуск PreBuild и PostBuild, если моя пользовательская цель не выдала никакого нового выхода. Пока я не нашел способ сделать это.

Другой вариант - предотвратить запуск пользовательской цели, если источники не изменились. К сожалению, файлы, созданные компилятором Intel, отмечены как «Исключить из сборки» и, таким образом, не запускают пользовательскую цель. Я попытался определить Input & Результат для задачи, выполняемой пользовательской целью, без везения.

Любая помощь будет высоко оценена!

ответ

1

Убедитесь, что ваши пользовательские цели имеют атрибут «Входы и выходы», который правильно описывает, какие файлы будут использоваться в качестве входных данных, и какой из них был результатом. 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> 

См:

+0

Похоже, это не работает для внешних инструментов. Я пробовал простую цель: – Joe

+0

\t Joe

+0

мишень запускает скрипт на Perl, чтобы скопировать a.txt в b.txt. Однако, когда я изменяю содержимое a.txt, пользовательская цель не вызывается. – Joe

 Смежные вопросы

  • Нет связанных вопросов^_^