Прежде всего, вы пропустили вставить важную часть (и, следовательно, то, что вы показываете, недействительно синтаксис 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». Это используется, в конечном счете, для изменения выполняемой команды компилятора/компоновщика и передачи ему флага, чтобы указать, какую библиотеку времени выполнения использовать.
Добавление элементов PropertyGroup использует различное значение параметров, например UseDebugLibraries. Дополнительные сведения см. По адресу: https: //msdn.microsoft.com/en-us/library/dd293607.aspx –