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


Пошаговое руководство. Создание файла проекта MSBuild с нуля

Языки программирования, предназначенные для .NET Framework, например Visual C# и Visual Basic, для описания и управления процессом построения приложения используют файлы проекта MSBuild.Если для создания файла проекта MSBuild используется Visual Studio, соответствующий код XML автоматически добавляется в файл.Однако полезно понимать, как организован XML и как его можно изменить для управления построением.В этом руководстве представлено описание способов пошагового создания основного файла проекта путем использования только текстового редактора.Ниже освещены следующие вопросы:

  • Создание минимального исходного файла приложения.

  • Создание минимального файла проекта MSBuild.

  • Расширение переменной среды PATH для включения MSBuild.

  • Построение приложения с помощью файла проекта.

  • Добавление свойств для управления построением.

  • Управление построением путем изменения значений свойств.

  • Добавление целевых объектов в построение.

  • Управление построением путем указания целевых объектов.

  • Инкрементное построение.

В этом руководстве представлена информация о построении проекта из командной строки и анализ результатов.Дополнительные сведения о MSBuild и запуске MSBuild из командной строки см. в разделе Пошаговое руководство. Использование MSBuild.

Для выполнения примеров в этом руководстве требуется наличие .NET Framework (версии 2.0, 3.5 или 4), поскольку эта платформа содержит необходимый для работы компилятор MSBuild и Visual C#.

Создание минимального приложения

В этом разделе описывается создание минимального исходного файла приложения Visual C# с помощью текстового редактора.

Чтобы создать минимальное приложение

  1. В командной строке перейдите в папку, в которой необходимо создать приложение, например \My Documents\ или \Desktop\.

  2. Чтобы создать подпапку \HelloWorld\, введите md HelloWorld.

  3. Чтобы перейти в новую папку, введите cd HelloWorld.

  4. Откройте Блокнот или другой текстовый редактор и введите следующий код.

    using System;
    
    class HelloWorld
    {
        static void Main()
        {
    #if DebugConfig
            Console.WriteLine("WE ARE IN THE DEBUG CONFIGURATION");
    #endif
    
            Console.WriteLine("Hello, world!");
        }
    }
    
  5. Сохраните этот файл с исходным кодом под именем Helloworld.cs.

  6. Чтобы построить приложение, введите в командной строке csc helloworld.cs.

  7. Чтобы протестировать приложение, введите в командной строке helloworld.

    Должно отобразиться сообщение Hello, world!.

  8. Чтобы удалить приложение, введите в командной строке del helloworld.exe.

Создание минимального файла проекта MSBuild

Поскольку уже существует исходный файл минимального приложения, можно создать минимальный проектный файл для построения приложения.Этот файл проекта содержит следующие элементы:

  • Необходимый корневой узел Project.

  • Узел ItemGroup с элементами.

  • Элемент, относящийся к исходному файлу приложения.

  • Узел Target с задачами, необходимыми для построения приложения.

  • Элемент Task для запуска компилятора Visual C# для построения приложения.

Чтобы создать минимальный файл проекта MSBuild

  1. В текстовом редакторе замените имеющийся текст следующими двумя строками:

    <Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    </Project>
    
  2. Вставьте этот узел ItemGroup в качестве дочернего элемента узла Project:

      <ItemGroup>
        <Compile Include="helloworld.cs" />
      </ItemGroup>
    

    Следует обратить внимание, что этот узел ItemGroup уже содержит элемент.

  3. Добавьте узел Target в качестве дочернего элемента узла Project.Присвойте узлу имя Build.

      <Target Name="Build">
      </Target>
    
  4. Вставьте этот элемент задачи в качестве дочернего элемента узла Target:

        <Csc Sources="@(Compile)"/>
    
  5. Сохраните этот файл проекта под именем Helloworld.csproj.

Минимальный файл проекта должен выглядеть следующим образом:

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <Csc Sources="@(Compile)"/>  
  </Target>
</Project>

Задачи в целевом объекте Build выполняются последовательно.В этом случае задачей Csc компилятора Visual C# является только сама задача.Она ожидает список исходных файлов для компиляции, представленный значением элемента Compile.Элемент Compile ссылается только на один исходный файл Helloworld.cs.

ПримечаниеПримечание

Для ссылки на все файлы с расширением CS в элементе можно использовать подстановочный знак "звездочка" (*):

<Compile Include="*.cs" />

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

Расширение переменной Path для включения MSBuild

Перед запуском MSBuild следует расширить переменную среды PATH, чтобы она включала папку .NET Framework.

Чтобы расширить путь для включения MSBuild

  • В командной строке введите set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework\v4.0.Если в системе установлена другая версия .NET Framework, соответствующим образом измените номер версии.

    ПримечаниеПримечание

    Имя папки MSBuild может включать номер построения, например v2.0.50727.В этом случае укажите номер построения в командной строке, например set PATH=%PATH%;%WINDIR%\Microsoft.Net\Framework\v2.0.50727.

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

Использование файла проекта для построения приложения

Теперь, чтобы построить приложение, используйте только что созданный файл проекта.

Чтобы построить приложение

  1. В командной строке введите msbuild helloworld.csproj /t:Build.

    При этом будет создан целевой объект Build файла проекта Helloworld путем вызова компилятора Visual C# для создания приложения Helloworld.

  2. Протестируйте приложение, набрав helloworld.

    Должно отобразиться сообщение Hello, world!.

ПримечаниеПримечание

Повысив уровень детализации, можно получить более подробные сведения о построении.Чтобы задать уровень детализации как "подробный", введите в командной строке любую из следующих команд:

msbuild helloworld.csproj /t:Build /verbosity:detailed

Добавление свойств построения

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

  • Свойство AssemblyName задает имя приложения.

  • Свойство OutputPath задает папку с приложением.

Чтобы добавить свойства построения

  1. Удалите имеющееся приложение, введя в командной строке del helloworld.exe.

  2. В файле проекта вставьте элемент PropertyGroup сразу после открывающего элемента Project:

      <PropertyGroup>
        <AssemblyName>MSBuildSample</AssemblyName>
        <OutputPath>Bin\</OutputPath>
      </PropertyGroup>
    
  3. Добавьте эту задачу в целевой объект Build непосредственно перед задачей Csc:

        <MakeDir Directories="$(OutputPath)"      Condition="!Exists('$(OutputPath)')" />
    

    Задача MakeDir создает папку, имя которой присваивает свойство OutputPath, при условии, что папка с таким именем еще не существует.

  4. Добавьте атрибут OutputAssembly в задачу Csc.

    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
    

    Это позволит компилятору Visual C# создать сборку, имя которой присвоено свойством AssemblyName, и разместить ее в папке, имя которой присвоено свойством OutputPath.

  5. Сохраните изменения.

Теперь минимальный файл проекта должен выглядеть следующим образом:

<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AssemblyName>MSBuildSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
</Project>
ПримечаниеПримечание

Рекомендуется добавлять разделитель пути "обратная косая черта" (\) в конце имени папки при указании в элементе OutputPath вместо добавления его в атрибуте OutputAssembly задачи Csc.Поэтому

<OutputPath>Bin\</OutputPath>

OutputAssembly=="$(OutputPath)$(AssemblyName).exe" />

лучше, чем

<OutputPath>Bin</OutputPath>

OutputAssembly=="$(OutputPath)\$(AssemblyName).exe" />

Тестирование свойств приложения

Теперь можно построить приложение с помощью файла проекта, в котором были использованы свойства построения для указания выходной папки и имени приложения.

Чтобы протестировать свойства построения

  1. В командной строке введите msbuild helloworld.csproj /t:Build.

    При этом создается папка \Bin\, вызывается компилятор Visual C# для создания приложения MSBuildSample и это приложение размещается в папке \Bin\.

  2. Чтобы убедиться в наличии папки \Bin\, содержащей приложение MSBuildSample, введите dir Bin.

  3. Протестируйте приложение, набрав Bin\MSBuildSample.

    Должно отобразиться сообщение Hello, world!.

Добавление целевых объектов построения

Теперь добавим в файл проекта еще два целевых объекта:

  • целевой объект Clean (Очистить), который удаляет старые файлы.

  • целевой объект Rebuild, использующий атрибут DependsOnTargets для принудительного выполнения задачи Clean перед задачей Build.

Теперь, когда имеется несколько целевых объектов, можно задать целевой объект Build как объект по умолчанию.

Чтобы добавить целевые объекты построения

  1. В файле проекта добавьте следующие два целевых объекта непосредственно после целевого объекта Build:

      <Target Name="Clean" >
        <Delete Files="$(OutputPath)$(AssemblyName).exe" />
      </Target>
      <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
    

    целевой объект Clean вызывает задачу Delete для удаления приложения.целевой объект Rebuild (Перестроить) не выполняется, пока не будет выполнены целевые объекты Clean и Build.Несмотря на то что в целевом объекте Rebuild задачи отсутствуют, он выполняет целевой объект Clean перед выполнением целевого объекта Build.

  2. Добавьте атрибут DefaultTargets в открывающий элемент Project.

    <Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
    

    При этом целевой объект Build будет задан как объект по умолчанию.

Теперь минимальный файл проекта должен выглядеть следующим образом:

<Project DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AssemblyName>MSBuildSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Clean" >
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
</Project>

Тестирование целевых объектов построения

Чтобы протестировать функции файла проекта, можно выполнить новые целевые объекты построения:

  • Создание построения по умолчанию.

  • Присвоение приложению имени через командную строку.

  • Удаление приложения перед созданием другого приложения.

  • Удаление приложения без построения другого приложения.

Чтобы протестировать целевые объекты построения

  1. В командной строке введите msbuild helloworld.csproj /p:AssemblyName=Greetings.

    Поскольку для явного задания целевого объекта параметр /t не использовался, MSBuild выполняет целевой объект Build по умолчанию.Параметр /p переопределяет свойство AssemblyName и присваивает ему новое значение Greetings.В результате в папке \Bin\ создается новое приложение Greetings.exe.

  2. Чтобы убедиться в наличии папки \Bin\, содержащей приложение MSBuildSample и новое приложение Greetings, введите dir Bin.

  3. Протестируйте приложение Greetings, набрав Bin\Greetings.

    Должно отобразиться сообщение Hello, world!.

  4. Удалите приложение MSBuildSample, набрав msbuild helloworld.csproj /t:clean.

    При этом будет выполнена задача Clean для удаления приложения со значением свойства по умолчанию AssemblyName — MSBuildSample.

  5. Удалите приложение Greetings, набрав msbuild helloworld.csproj /t:clean /p:AssemblyName=Greetings.

    При этом будет выполнена задача Clean для удаления приложения с указанным значением свойства AssemblyName — Greetings.

  6. Чтобы убедиться, что папка \Bin\ пустая, введите dir Bin.

  7. Введите msbuild.

    Несмотря на то что файл проекта не указан, MSBuild создает файл helloworld.csproj, поскольку в текущей папке находится только один файл проекта.Результате в папке \Bin\ создается приложение MSBuildSample.

    Чтобы убедиться, что в папке \Bin\ содержится приложение MSBuildSample, введите dir Bin.

Инкрементное построение

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

Чтобы выполнить инкрементное построение

  1. В файле проекта добавьте следующие атрибуты к открывающему целевому объекту Build:

    Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe"
    

    При этом указывается, что целевой объект Build зависит от входных файлов, заданных в группе элементов Compile, а выходным целевым объектом является файл приложения.

    Результирующий целевой объект Build должен выглядеть следующим образом:

    <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
      <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
      <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
    </Target>
    
  2. Чтобы протестировать целевой объект Build, введите в командной строке msbuild /v:d.

    Следует помнить, что helloworld.csproj является файлом проекта по умолчанию, а Build — целевой объект по умолчанию.

    Параметр /v:d задает уровень детализации описания процесса построения.

    Должны отображаться следующие строки:

    Skipping target "Build" because all output files are up-to-date with respect to the input files.

    Input files: HelloWorld.cs

    Output files: Bin\MSBuildSample.exe

    MSBuild пропускает целевой объект Build, поскольку ни один из исходных файлов не был изменен с момента последнего построения приложения.

Пример

Dd576348.collapse_all(ru-ru,VS.110).gifОписание

В приведенном ниже примере показан файл проекта, в котором выполняется компиляция приложения Visual C# и в журнал записывается сообщение, содержащее имя выходного файла.

Dd576348.collapse_all(ru-ru,VS.110).gifКод

<Project DefaultTargets = "Compile"
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >

    <!-- 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)"
            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>

Пример

Dd576348.collapse_all(ru-ru,VS.110).gifОписание

В приведенном ниже примере показан файл проекта, в котором выполняется компиляция приложения Visual Basic и в журнал записывается сообщение, содержащее имя выходного файла.

Dd576348.collapse_all(ru-ru,VS.110).gifКод

<Project DefaultTargets = "Compile"
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >

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

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <VBFile Include = "consolehwvb1.vb"/>
    </ItemGroup>

    <Target Name = "Compile">    
        <!-- Run the Visual Basic compilation using input files of type VBFile -->
        <VBC
            Sources = "@(VBFile)"
            OutputAssembly= "$(appname).exe">
            <!-- Set the OutputAssembly attribute of the VBC task
            to the name of the executable file that is created -->
            <Output
                TaskParameter = "OutputAssembly"
                ItemName = "EXEFile" />
        </VBC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Что дальше?

Visual Studio может автоматически выполнять большую часть действий, описанных в этом руководстве.Сведения об использовании Visual Studio для создания, редактирования, построения и тестирования файлов проекта MSBuild см. в разделе Пошаговое руководство. Использование MSBuild.

См. также

Другие ресурсы

MSBuild

Справочные сведения о MSBuild