Как сделать выполнение пользовательской цели MSBuild зависимым от отметки времени файла? - PullRequest
5 голосов
/ 27 мая 2011

Проект C ++, над которым я работаю (который я конвертировал из VS2008 в VS2010), использовал несколько файлов vcbuild .rules для указания пользовательских правил сборки.Эти файлы .rules имели специальное свойство «AdditionalDependencies» для узла CustomBuildRule, в котором указывался список файлов, которые следует учитывать при разработке, нужно ли перестроить цель или нет.Эти «Дополнительные зависимости» были точно перенесены в соответствующий файл .props во время преобразования VS2010.

Файл .targets, связанный с пользовательским правилом сборки, добавляет эти AdditionalDependencies к свойству Inputs Target узел.Это гарантирует, что цель будет выполнена в случае, если какой-либо из файлов, перечисленных в зависимостях, не существует, но она не выполнит цель, если одна из зависимостей новее, чем выходные данные цели.Это также не совсем логически правильно, поскольку не все файлы фактически являются входными данными, некоторые из них относятся к исполняемым файлам, которые могут использоваться во время сборки цели.Таким образом, они могут быть проверены в системе контроля версий и будут присутствовать, но более новая версия файла должна инициировать перестроение уязвимой цели.

Документация MSDN для цели узел показывает свойство Condition, которое должно нормально работать для моих требований, но условия, поддерживаемые этим свойством, не отображаются после теста «Exists», который уже выполняется.

Есть ли условие, при которомЯ могу использовать метод, который будет сравнивать метки времени двух файлов (или, в идеале, метку времени файлов, перечисленных в настоящее время в AdditionalDependencies, с выходными файлами цели), и, таким образом, позволять мне запускать «по-подобному», перестраивать эту цель, если онаустарели эти зависимости "?

1 Ответ

2 голосов
/ 08 июня 2011

Пожалуйста, посмотрите на цель Output свойство:

"MSBuild может сравнивать временные метки входных файлов с временными метками выходных файлов и определять, следует ли пропустить, построить или частично перестроить цель. В следующем примере, если какой-либо файл в @ (CSFile) ) список элементов новее, чем файл hello.exe, MSBuild запустит цель, в противном случае он будет пропущен: "

<Target Name="Build" 
    Inputs="@(CSFile)" 
    Outputs="hello.exe">

    <Csc
        Sources="@(CSFile)" 
        OutputAssembly="hello.exe"/>
</Target>

Оригинальную статью и дополнительную информацию о инкрементных сборках с MSBuild можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...