Поделиться через


Создание нескольких конфигураций сборки для исходных файлов

При сборке проектов часто компилируется одни и те же компоненты с различными параметрами сборки. Например, можно создать отладочную сборку с информацией о символах или финальную сборку без информации о символах, но с включенными оптимизациями. Вы также можете создать проект для запуска на определенной платформе, например x86 или x64. Во всех этих случаях большинство вариантов сборки остаются одинаковыми. Для управления конфигурацией сборки изменяются только несколько вариантов. При использовании MSBuild вы используете свойства и условия для создания различных конфигураций сборки для исходных файлов.

Использование свойств для управления параметрами сборки

Элемент Property определяет переменную с несколькими ссылками в файле проекта. Переменная может определить расположение временного каталога или задать значения параметров, используемых в нескольких конфигурациях, таких как Debug и Release сборки. Дополнительные сведения о свойствах см. в разделе свойства MSBuild.

Свойства можно использовать для изменения конфигурации сборки, не изменяя файл проекта. Атрибут Condition элементов Property и PropertyGroup позволяет изменить значения их свойств.

  • Чтобы определить свойство, которое зависит от другого свойства, задайте Condition атрибут в элементе Property :

    <DebugType Condition="'$(Flavor)'=='DEBUG'">full</DebugType>
    
  • Чтобы определить группу свойств, зависящих от другого свойства, задайте Condition атрибут в элементе PropertyGroup :

    <PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
        <DebugType>full</DebugType>
        <Optimize>no</Optimize>
    </PropertyGroup>
    

Дополнительные сведения об условиях MSBuild см. в разделе "Условия".

Указание свойств в командной строке

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

  • Чтобы задать свойство проекта в командной строке, используйте -property переключатель (или -p) с именем и значением свойства:

    msbuild file.proj -property:Flavor=Debug
    
  • Чтобы указать несколько свойств проекта в командной строке, используйте -property ключ (-p) для каждого имени и значения свойства.

    msbuild file.proj -p:Flavor=Debug -p:Platform=x86
    
  • Существует упрощение для указания нескольких свойств в командной строке. -property Введите переключатель (-p) один раз и разделите список имен свойств и значений точкой с запятой (;):

    msbuild file.proj -p:Flavor=Debug;Platform=x86;Verbose=True
    

Обработка приоритета между переменными и свойствами среды

MSBuild обрабатывает значения переменной среды так же, как и свойства. Когда сборка встречает несколько значений для свойства, она задает значение в соответствии с порядком приоритета: командная строка (наивысший), файл проекта и переменная среды (наименьшая).

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

  • Значение свойства, заданное в файле проекта, имеет приоритет над соответствующим значением, определенным в переменной среды.

Вы можете изменить поведение приоритета с помощью атрибута TreatAsLocalProperty в теге проекта. При перечислении имен свойств с этим атрибутом значение свойства, указанное в командной строке, не имеет приоритета над значением в файле проекта. Пример см. в разделе "Изменение приоритета" с атрибутом TreatAsLocalProperty.

Дополнительные сведения см. в разделе "Использование переменных среды в сборке".

Изменение конфигураций сборки с помощью групп свойств

В следующем примере показан файл проекта, который определяет две группы свойств для создания версии отладки или выпуска проекта.

  • Чтобы создать отладочную версию, используйте переключатель -property (-p) со значением свойства flavor, установленным на debug.

    msbuild consolehwcs1.proj -p:flavor=debug
    
  • Чтобы собрать релизную версию, используйте переключатель -property (-p) со значением свойства, установленным в flavor:

    msbuild consolehwcs1.proj -p:flavor=retail
    

Ниже приведен файл проекта:

<Project DefaultTargets = "Compile">

    <!-- Set default flavor, if env variable 'Flavor' not set or specified on command line -->
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
    </PropertyGroup>

    <!-- Define DEBUG settings -->
    <PropertyGroup Condition="'$(Flavor)'=='DEBUG'">
        <DebugType>full</DebugType>
        <Optimize>no</Optimize>
    </PropertyGroup>

    <!-- Define RETAIL settings -->
    <PropertyGroup Condition="'$(Flavor)'=='RETAIL'">
        <DebugType>pdbonly</DebugType>
        <Optimize>yes</Optimize>
    </PropertyGroup>

    <!-- Set application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldCS</appname>
    </PropertyGroup>

    <!-- Specify inputs by type and file name -->
    <ItemGroup>
        <CSFile Include = "consolehwcs1.cs"/>
    </ItemGroup>

    <Target Name = "Compile">
        <!-- Run Visual C# compilation using input file of type CSFile -->
        <CSC  Sources = "@(CSFile)"
            DebugType="$(DebugType)"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe" >

            <!-- Set OutputAssembly attribute of CSC task to name of created executable file -->
            <Output TaskParameter="OutputAssembly"
                ItemName = "EXEFile" />
        </CSC>
        <!-- Log file name of output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Изменение приоритета атрибута TreatAsLocalProperty

В следующем примере показано, как использовать TreatAsLocalProperty атрибут. Свойство Color имеет значение Blue в файле проекта и Green в командной строке. Для параметра атрибута TreatAsLocalProperty="Color" в теге проекта свойство командной строки (Green) не переопределяет значение свойства, заданное в файле проекта (Blue).

Чтобы создать проект, введите следующую команду:

msbuild colortest.proj -t:go -property:Color=Green

Ниже приведен файл проекта:

<Project 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
-->