Практическое руководство. Построение одинаковых исходных файлов с различными параметрами
При создании проектов очень часто компилируете одинаковые компоненты с различными параметрами построения. Например, можно создать отладочную сборку с символьными данными или выпускаемое построение без символьных данных, но с поддержкой оптимизации. Можно также создать проект для выполнения на определенной платформе, например x86 или x64. Во всех этих случаях большая часть параметров построения остается одинаковой; только несколько параметров изменяется, определяя конфигурацию построения. В MSBuild для создания различных конфигураций построения используются свойства и условия.
Использование свойств для изменения проектов
Элемент Property определяет переменную, которая несколько раз указывается в файле проекта в качестве ссылки, например расположение временного каталога, или задает значения для свойств, используемых в нескольких конфигурациях, например в отладочном построении (Debug) и построении для выпуска (Release). Дополнительные сведения о свойствах см. в разделе Свойства MSBuild.
С помощью свойств можно изменить конфигурацию построения, не изменяя файл проекта. Атрибут Condition элемента Property и элемент PropertyGroup позволяют изменить значение свойств. Дополнительные сведения об условиях MSBuild см. в разделе Условия MSBuild.
Задание группы свойств на основе другого свойства
Используйте атрибут Condition в элементе PropertyGroup следующим образом:
<PropertyGroup Condition="'$(Flavor)'=='DEBUG'"> <DebugType>full</DebugType> <Optimize>no</Optimize> </PropertyGroup>
Определение свойства на основе другого свойства
Используйте атрибут Condition в элементе Property следующим образом:
<DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
Задание свойств в командной строке
Если файл проекта поддерживает несколько конфигураций, необходимо иметь возможность изменения этих конфигураций при построении проекта. MSBuild предоставляет такую возможность, позволяя указывать свойства в командной строке с использованием ключа /property или /p.
Задание свойства проекта в командной строке
Используйте ключ /property, указывая имя и значение свойства. Например:
msbuild file.proj /property:Flavor=Debug
- или -
Msbuild file.proj /p:Flavor=Debug
Задание нескольких свойств проекта в командной строке
Используйте ключ /property или /p несколько раз, указывая имена и значения свойств, либо используйте один ключ /property или /p с несколькими свойствами, отделяя их точкой с запятой (;). Например:
msbuild file.proj /p:Flavor=Debug;Platform=x86
или
msbuild file.proj /p:Flavor=Debug /p:Platform=x86
Переменные среды также воспринимаются в MSBuild как свойства и подключаются автоматически. Дополнительные сведения об использовании переменных среды см. в разделе Практическое руководство. Использование переменных среды в построении.
Значение свойства, указанное в командной строке, имеет более высокий приоритет по сравнению с каким-либо значением, заданным для этого свойства в файле проекта, а значение, заданное в файле проекта, имеет более высокий приоритет, чем значение в переменной среды.
Можно изменить эту функциональности с помощью атрибута TreatAsLocalProperty в теге проекта. Для имен свойств, перечислены с этим атрибутом, значение свойства, которое указано в командной строке не имеет приоритет над значением в файле проекта. Можно найти пример далее в этом разделе.
Пример
В следующем примере кода "hello world", проект содержит 2 новых группы свойств, которые можно использовать для создания построение и отладка построения выпуска.
Чтобы создать отладочную версию проекта, введите:
msbuild consolehwcs1.proj /p:flavor=debug
Чтобы создать версию проекта для розничной продажи, введите:
msbuild consolehwcs1.proj /p:flavor=retail
<Project DefaultTargets = "Compile"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<!-- Sets the default flavor of an environment variable called
Flavor is not set or specified on the command line -->
<PropertyGroup>
<Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
</PropertyGroup>
<!-- Define the DEBUG settings -->
<PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
<DebugType>full</DebugType>
<Optimize>no</Optimize>
</PropertyGroup>
<!-- Define the RETAIL settings -->
<PropertyGroup Condition="'$(Flavor)'=='RETAIL'">
<DebugType>pdbonly</DebugType>
<Optimize>yes</Optimize>
</PropertyGroup>
<!-- Set the application name as a property -->
<PropertyGroup>
<appname>HelloWorldCS</appname>
</PropertyGroup>
<!-- Specify the inputs by type and file name -->
<ItemGroup>
<CSFile Include = "consolehwcs1.cs"/>
</ItemGroup>
<Target Name = "Compile">
<!-- Run the Visual C# compilation using input files
of type CSFile -->
<CSC Sources = "@(CSFile)"
DebugType="$(DebugType)"
Optimize="$(Optimize)"
OutputAssembly="$(appname).exe" >
<!-- Set the OutputAssembly attribute of the CSC
task to the name of the executable file that is
created -->
<Output TaskParameter="OutputAssembly"
ItemName = "EXEFile" />
</CSC>
<!-- Log the file name of the output file -->
<Message Text="The output file is @(EXEFile)"/>
</Target>
</Project>
В следующем примере показано, как использовать атрибут TreatAsLocalProperty. Свойство Color имеет значение Blue в файле проекта и Green в командной строке. С TreatAsLocalProperty="Color" в теге проекта, свойство командной строки (Green) не переопределяет свойство, определенное в файле проекта (Blue).
Для построения проекта введите следующую команду:
msbuild colortest.proj /t:go /property:Color=Green
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003"
ToolsVersion="4.0" TreatAsLocalProperty="Color">
<PropertyGroup>
<Color>Blue</Color>
</PropertyGroup>
<Target Name="go">
<Message Text="Color: $(Color)" />
</Target>
</Project>
<!--
Output with TreatAsLocalProperty="Color" in project tag:
Color: Blue
Output without TreatAsLocalProperty="Color" in project tag:
Color: Green
-->