Сборка одинаковых исходных файлов с различными параметрами

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

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

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

Свойства можно использовать для изменения конфигурации сборки без редактирования файла проекта. Атрибут Condition элемента Property и элемент PropertyGroup позволяют изменять значения свойств. Дополнительные сведения об условиях 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
    

    or

    Msbuild file.proj -p:Flavor=Debug
    

Задание нескольких свойств проекта в командной строке

  • Используйте параметр -property или -p с указанием свойств и их значений либо используйте один параметр -property или -p, указав несколько свойств через точку с запятой (;). Например:

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

    or

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

    Переменные среды также обрабатываются как свойства и автоматически внедряются MSBuild. Дополнительные сведения об использовании переменных среды см. в разделе Практическое руководство. Использование переменных среды в сборке.

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

    Это поведение можно изменить с помощью атрибута TreatAsLocalProperty в теге проекта. Для имен свойств, которые указаны с использованием этого атрибута, значение свойства, заданное в командной строке, не имеет приоритет над значением в файле проекта. См. пример далее в этом разделе.

Пример 1

В следующем примере кода проект Hello World содержит две новых группы свойств, которые можно использовать для создания отладочной сборки и сборки выпуска.

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

msbuild consolehwcs1.proj -p:flavor=debug

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

msbuild consolehwcs1.proj -p:flavor=retail
<Project DefaultTargets = "Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <!-- Sets the default flavor if 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>

Пример 2

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

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

msbuild colortest.proj -t:go -property:Color=Green
<Project xmlns="http://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
-->