2017-01-07 7 views
0

Когда я создаю проект Visual Studio, я получаю следующее в моем файле проекта для MSBuild на C++:ProjectConfiguration против PropertyGroup (MSBuild)

<ProjectConfiguration Include="Debug|Win32"> 
    <Configuration>Debug</Configuration> 
    <Platform>Win32</Platform> 
</ProjectConfiguration> 

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> 
    <ConfigurationType>Application</ConfigurationType> 
    <UseDebugLibraries>true</UseDebugLibraries> 
    <PlatformToolset>v140</PlatformToolset> 
    <CharacterSet>Unicode</CharacterSet> 
</PropertyGroup> 

Я не понимаю, в чем разница между этими двумя секциями. Когда я запускаю следующее:

MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32 

Что применяется? Объединяются ли они в единое целое? Я не понимаю разницы между «include» ProjectConfiguration и «condition» PropertyGroup.

+0

Добавление элементов PropertyGroup использует различное значение параметров, например UseDebugLibraries. Дополнительные сведения см. По адресу: https: //msdn.microsoft.com/en-us/library/dd293607.aspx –

ответ

1

Прежде всего, вы пропустили вставить важную часть (и, следовательно, то, что вы показываете, недействительно синтаксис msbuild): «ProjectConfiguration» - это Item, поскольку он находится внутри ItemGroup. Таким образом, полное определение на самом деле, например:

<ItemGroup> 
    <ProjectConfiguration Include="Debug|Win32"> 
    <Configuration>Debug</Configuration> 
    <Platform>Win32</Platform> 
    </ProjectConfiguration> 
    <ProjectConfiguration Include="Release|Win32"> 
    <Configuration>Debug</Configuration> 
    <Platform>Win32</Platform> 
    </ProjectConfiguration> 
</ItemGroup> 

Это определяет список/массив/коллекция/', что вы хотите назвать это назвали ProjectConfiguration с 2-х элементов. Первым элементом является «Debug | Win32» и имеет 2 Metadata элементов: сначала «Конфигурация» со значением «Отладка», а вторая называется «Платформа» со значением «Win32». Элемент ProjectConfiguration в основном служит списком, сообщающим системе сборки, включая gui в VS, какие комбинации конфигурации/платформы существуют для проекта.

Properties определены в PropertyGroup и являются просто парами ключ/значение. Атрибут Condition в PropertyGroup приводит к тому, что свойства внутри него определяются только в том случае, если условие соответствует. Таким образом, хотя оба параметра Include и Condition являются xml-атрибутами, они выполняют совершенно разные цели: первый, используемый в элементе, добавляет элемент в коллекцию Item, а второй - условный (который, кстати, также может быть помещен почти во все остальные msbuild элемент, так же и на Item или ItemGroup), который при оценке False отбрасывает содержимое.

Когда запускаю следующее: MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32 Что применяется? Объединяются ли они в единое целое?

Передача /p определяет свойства в командной строке, не отличаются от свойств, определенных в PropertyGroup (кроме того свойства, определенные в командной строке, как правило, переопределить те, которые указаны в файле проекта). Теперь для ItemGroup это не имеет значения, что вы передаете в командной строке: он все еще содержит два элемента, сообщающих системе сборки, какие комбинации доступны. Тем не менее, он меняет свойства. Рассмотрим:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> 
    <UseDebugLibraries>true</UseDebugLibraries> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> 
    <UseDebugLibraries>false</UseDebugLibraries> 
</PropertyGroup> 

Синтаксис $() используется для расширения значения свойств, так что если вы передаете/р: Configuration = Debug; Платформа = Win32 в командной строке, то '$ (Configuration) | $ (Platform)' ==» Debug | Win32 '"после разбора и оценки расширяется до« Debug | Win32 »==« Debug | Win32 », который, в свою очередь, оценивает значение True. Таким образом, первое определение PropertyGroup вступает в силу, но не второе, поскольку для последнего условие не совпадает. В результате свойство с именем 'UseDebugLibraries' получает значение 'true'. Если вы передадите/p: Configuration = Release; Platform = Win32, вместо этого получится значение «false». Это используется, в конечном счете, для изменения выполняемой команды компилятора/компоновщика и передачи ему флага, чтобы указать, какую библиотеку времени выполнения использовать.

+0

Не могли бы вы объединить два, то есть добавить элементы PropertyGroup в ProjectConfiguration, так как Condition = "'$ (Конфигурация) | $ (Платформа)' == 'Debug | Win32'" всегда будет соответствовать Include = "Debug | Win32 «? – user651351

+0

Вы можете это сделать, но это не эквивалентно: элемент, такой как ProjectConfiguration, имеет несколько элементов, свойство - это только одна пара ключей/значений. – stijn