MSBuild Наследует Набор Инструментов Платформы


Я пытаюсь пересмотреть процессы сборки моего проекта. У нас есть ~330 проектов Visual C++, которые мы обновили в прошлом году с Visual Studio 2005 до Visual Studio 2013. Я хотел бы воспользоваться преимуществами MSBuild, чтобы улучшить наше время сборки по сравнению с нашими очень последовательными сценариями сборки, которые у нас есть сейчас. Я выполнил грубый первый проход и сократил время сборки для сборки выпуска с ~2 часов до ~20 минут. В процессе этого я консолидирую очень много общих проектов. настройки в .файл реквизитов . Поступая так, я столкнулся с камнем преткновения.

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

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="Configuration">
   <PlatformToolSet>v120</PlatformToolSet>
</PropertyGroup>
<PropertyGroup Label="UserMacros" />
Затем я удалил соответствующий файл <PlatformToolSet>v120</PlatformToolset> из отдельных файлов проекта.

Увы, дела начали идти в гору. Проекты (в Visual Studio 2013) теперь говорят в обозревателе решений что-то вроде CoreGeometry (Visual Studio 2010) и сами проекты, похоже, хотят ссылаться на набор инструментов платформы v100. Когда я строю, он потом жалуется на меня:

C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppBuild.targets(362,5): warning MSB8003: Could not find WindowsSDKDir variable from the registry. TargetFrameworkVersion or PlatformToolset may be set to an invalid version number.

1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(341,5): error MSB6006: "CL.exe" exited with code -1073741515.

Единственный способ, которым я смог обойти это, - вручную установить PlatformToolset на .vcxproj сами по себе, что не страшно, меня просто немного раздражает, что все остальные свойства вроде бы наследуются, но PlatformToolset этого не делает.

Мой вопрос таков:: Могу ли я использовать a .файл реквизитов для наследования общего PlatformToolSet в a .vcxproj, который не указывает набор инструментов платформы?

Второй вопрос: Должен ли я вообще возиться с набором инструментов платформы таким образом или я подвергаю себя риску кошмара обслуживания позже?

1 3

1 ответ:

Очень хорошей практикой является извлечение общих настроек в отдельный .props file и <Import> что из всех проектов. Я делаю то же самое со своими проектами, включая настройку свойства PlatformToolset.реквизит файл, и у меня нет проблем построить его таким образом.

Несколько моментов, связанных с этим:

  1. нет ничего особенного в PlatformToolset собственности, или любой другой собственности, если на то пошло. Настройка свойств внутри .файл реквизита идентичен установке его внутри .файл vcxproj непосредственно (однако смотрите мой пункт ниже о заказе). Конечно, есть некоторые встроенные свойства, которые вы не можете настроить вообще, но они всегда доступны только для чтения.
  2. единственный случай, когда вы не сможете переопределить свойство, если это значение свойства передается непосредственно из командной строки для сборки (например, msbuild mysolution.sln /p:Platform=x86 будет иметь все построенное со свойством платформы, установленным в x86, и переопределения в проектах не вступят в силу).
  3. есть разница между MSBuild engine интерпретирует ваши проекты и Visual Studio показывает настройки для проекта. В некоторых случаях вы можете обнаружить это после рефакторинга .файлы vcxproj некоторые стандартные диалоговые окна конфигурации проекта не показывают информацию, которую вы настроили .реквизит файла. Чтобы облегчить это ,убедитесь, что ваша команда <Import> для.реквизит файл всегда может найти .реквизит файла, установив абсолютный путь к .реквизит файла. Во-вторых, убедитесь, что вы указали атрибут Label для элемента <PropertyGroup> в своей конфигурации файл, как это было указано в вашем .файл vcxproj.
  4. Наконец, убедитесь, что ваш элемент <Import> находится в нужном месте. Обычно вы хотите, чтобы это был самый первый импорт, прежде чем импортировать стандарт .задачи и .реквизит, как у Microsoft.СРР.по умолчанию.упорки, etc. Причина в том, что msbuild работает путем последовательного сканирования через операторы, поэтому порядок инструкций имеет значение.

Чтобы сделать #3 и #4 проще, вот трюк, чтобы указать абсолютный путь к .реквизит файла. Предположим, что ваш решение называется MySolution.sln и пользовательский файл реквизитов-это MyCustomProps.реквизит, помещенный в тот же каталог, где находится решение:

<PropertyGroup>
       <RootFolder>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory),MySolution.sln))</RootFolder>
</PropertyGroup>
<Import Project="$(RootFolder)\MyCustomProps.props" />