Как Visual Studio 2010 размещает MSBuild для проектов C ++? - PullRequest
1 голос
/ 09 марта 2011

У меня есть решение с несколькими проектами C ++.Для некоторых проектов мне нужна некоторая пользовательская копия файла, например, чтобы скопировать некоторые файлы конфигурации в выходной каталог или скопировать выходные файлы одного проекта в определенную папку после сборки.

В некоторых случаях я не 'Не хотите или не можете добавить эти файлы в проекты напрямую через Visual Studio IDE.Я создал простые файлы .targets, которые я могу использовать повторно и добавлять в проекты, которые требуют копирования файлов.

Вот простой пример файла .targets для копирования файлов конфигурации:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <PropertyGroup>
 <BuildDependsOn>
  $(BuildDependsOn);
  CopyCustom
 </BuildDependsOn>
 </PropertyGroup>
 <ItemGroup>
 <CustomFiles Include="$(ProjectDir)Config\**\*.xml" />
 </ItemGroup>
 <PropertyGroup>
 <DestCustFolder>$(OutDir)Config\</DestCustFolder>
 </PropertyGroup> 
 <Target Name="CopyCustom"
 Inputs="@(CustomFiles )"
 Outputs="@(CustomFiles ->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')"> 
 <Message Text="Copy custom files..." />
 <Copy SourceFiles="@(CustomFiles )" DestinationFiles="@(CustomFiles->'$(DestCustFolder)%(RecursiveDir)%(FileName)%(Extension)')" SkipUnchangedFiles="true" />
 </Target>
</Project>

Через диалоговое окно «Настройка сборки» в Visual Studio я добавляю его в проект, чтобы он был включен какэто в конце файла проекта:

 <ImportGroup Label="ExtensionTargets">
<Import Project="..\Targets\CopyCustom.targets" />/
 </ImportGroup>

Это должно включить инкрементную сборку моей пользовательской цели.Если я просто отредактирую один из моих пользовательских файлов (и ни один из файлов C ++) и соберу его из консоли с помощью

msbuild foo1.vcxproj

, он фактически обнаружит изменения и выполнит инкрементную сборку для моей пользовательской цели.Если никакие изменения не вносятся, цель пропускается.

Если я все же собираю внутри Visual Studio, он не обнаружит изменения в пользовательских файлах и только и сообщит мне, что проект соответствует данным:

========== Build: 0 succeeded, 0 failed, 5 up-to-date, 0 skipped ==========

Мне пришлось бы дополнительно изменить один из файлов C ++, чтобы он снова проверил все цели и добавочную сборку.

Я ожидал, что Visual Studio просто выполнит MSBuild, который затем выполнитактуальная проверка проектов, поэтому она должна быть такой же, как и запуск MSBuild из консоли.Я пытался получить больше информации, устанавливая уровень многословия для диагностики, но я просто получаю ту же строку.Мне кажется, что MSBuild даже не выполняется для проекта, но сама Visual Studio определяет, что проект является современным.

Поэтому мне было интересно, как Visual Studio фактически определяет, когда он должен выполнять MSBuild дляпроект.

Я задавал в основном тот же вопрос раньше на форуме MSDN , но не смог получить четкий ответ.

Ответы [ 2 ]

4 голосов
/ 21 августа 2011

См. это предложение в Microsoft Connect .

В основном вам необходимо установить для свойства DisableFastUpToDateCheck значение true, чтобы отключить быструю актуальную проверку.добавьте в ваш vcxproj или файл ваших целей:

<PropertyGroup>  
  <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup>
1 голос
/ 22 марта 2011

Я нашел ответ, заглянув в книгу «Внутри Microsoft Build Engine, второе издание».

Примечание: я также обновил то же самое в своем вопросе на форуме MSDN , но я буду в основном дублировать текст здесь снова для полноты.

На странице 280 они фактически говорят, что IDE выполняет «быструю актуальную проверку» на уровне проекта. Он только порождает сборку проекта и выполняет более детальную проверку отдельных задач, если эта грубая проверка на уровне проекта не удалась.

При запуске MSBuild из командной строки, однако, всегда есть точная и точная проверка отдельных инструментов.

Таким образом, кажется, что IDE выполняет эту быструю проверку только тех файлов, которые добавляются в проекты напрямую и задаются как один из типов «Входной файл».

На мой взгляд, это не очень хороший дизайн. Я бы предпочел, чтобы среда IDE использовалась только для редактирования файлов проекта MSBuild, а затем просто вызывала MSBuild для выполнения текущей проверки. Это сделало бы это намного яснее.

Я могу понять, что в решении с большим количеством проектов оно может значительно ускорить текущую проверку, но должна быть хотя бы опция, позволяющая отключить быструю актуальную проверку. Я проверял IDE, если есть способ отключить это поведение, но не смог ничего найти.

Решение, предложенное здесь на самом деле работает, и я использую его в данный момент. Но я добавил несколько пользовательских целей для различных типов пользовательских файлов. Если я добавляю новый пользовательский файл, я никогда не должен забывать установить его в «Custom Build Tool», иначе инкрементная сборка для этого файла не будет работать.

Я полагаю, что решением было бы сделать полную настройку сборки для моих пользовательских файлов и использовать для них определенные расширения файлов, чтобы Visual Studio автоматически обнаруживал их при добавлении в проект и устанавливал правильный тип элемента.

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