Пошаговое руководство. Использование MSBuild
MSBuild — это платформа построения для Microsoft и Visual Studio.В этом пошаговом руководстве представлено описание стандартных блоков MSBuild и способы создания, управления и отладки проектов MSBuild.Ниже описываются следующие вопросы:
Создание и управление файлом проекта.
Способы использования свойств построения.
Способы использования элементов построения.
MSBuild можно запустить из Visual Studio или из командного окна.В этом пошаговом руководстве показано создание файла проекта MSBuild с помощью Visual Studio.Файл проекта можно редактировать в Visual Studio, а в командном окне можно построить проект и проанализировать результаты построения.
Создание проекта MSBuild
Система проектов Visual Studio основана на MSBuild.Благодаря ей упрощается создание нового файла проекта с помощью Visual Studio.В этом разделе описывается создание файла проекта Visual C#.Вместо него можно создать файл проекта Visual Basic.В рамках этого руководства различия между двумя файлами проекта незначительны.
Чтобы создать файл проекта
Запустите Visual Studio.
В меню Файл последовательно выберите пункты Создать и Проект.
В диалоговом окне Новый проект выберите тип проекта Visual C# и щелкните шаблон Приложение Windows Forms.В поле Имя введите BuildApp.Для решения укажите Расположение, например D:\.Примите значение по умолчанию для поля Создать каталог для решения (флажок установлен), диалоговое окно Добавить в систему управления версиями пустое, и Имя решения задано как BuildApp.
Щелкните ОК, чтобы создать файл проекта.
Анализ файла проекта
В предыдущем разделе файл проекта Visual C# создавался с помощью Visual Studio.Файл проекта представлен в обозревателе решений узлом проекта под названием BuildApp.Чтобы проанализировать файл проекта, можно использовать редактор кода Visual Studio.
Чтобы проанализировать файл проекта
В обозревателе решений щелкните узел проекта BuildApp.
Обратите внимание, что в браузере свойств свойство Файл проекта задано как BuildApp.csproj.К имени всех файлов проекта добавляется суффикс "proj".Если создается проект Visual Basic, имя файла проекта будет BuildApp.vbproj.
Щелкните правой кнопкой мыши узел проекта, а затем Отменить загрузку проекта.
Еще раз щелкните правой кнопкой мыши узел проекта и выберите Изменить BuildApp.csproj.
Файл проекта откроется в редакторе кода.
целевые объекты и задачи
Файлы проекта представляют собой файлы в формате XML с корневым узлом Project (Проект).
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
В элементе Project следует указать пространство имен xmlns.
Рабочий построение приложения выполняется с целевой объект и элементами задача.
Задача представляет собой наименьший блок, другими словами, это "атом" построения.Задачи являются независимыми исполняемыми компонентами, которые могут иметь входные и выходные данные.В настоящий момент отсутствуют задачи, на которые имеются ссылки или которые определены в файле проекта.В разделах ниже описано добавление задач в файл проекта.Дополнительные сведения см. в разделе Задачи MSBuild.
целевой объект представляет собой именованную последовательность задач.В конце файла проекта находятся два целевых объекта, которые в этом случае заключены в комментарии HTML: BeforeBuild и AfterBuild.
<Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild"> </Target>
Дополнительные сведения см. в разделе Цели MSBuild.
У узла Project имеется необязательный атрибут DefaultTargets, выбирающий целевой объект, который строится по умолчанию, в этом случае Build (Построение).
<Project ToolsVersion="4.0" DefaultTargets="Build" ...
целевой объект Build не определен в файле проекта.Вместо этого он импортируется из файла Microsoft.CSharp.targets с помощью элемента Import (Импорт).
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Импортированные файлы эффективно вставляются в файл проекта, если на них имеется ссылка.
MSBuild отслеживает целевые объекты построения и гарантирует, что каждый целевой объект будет построен не более одного раза.
Добавление целевого объекта и задачи
Добавьте целевой объект в файл проекта.Добавьте задачу в целевой объект, который выводит сообщение.
Чтобы добавить целевой объект и задачу
Добавьте эти строки в файл проекта непосредственно после оператора Import:
<Target Name="HelloWorld"> </Target>
При этом будет создан целевой объект под названием HelloWorld (Здравствуй, мир!).Следует обратить внимание на наличие поддержки Intellisense во время редактирования файла проекта.
Добавьте строки к целевому объекту HelloWorld, чтобы в результате раздел выглядел следующим образом:
<Target Name="HelloWorld"> <Message Text="Hello"></Message> <Message Text="World"></Message> </Target>
Сохраните файл проекта.
Задача Message (Сообщение) является одной из многих задач, поставляемых с MSBuild.Полный список доступных задач и информацию об их использовании см. в разделе Справочные сведения о задачах MSBuild.
Задача Message принимает строковое значение атрибута Text (Текст) в качестве входного и отображает его в устройстве вывода.целевой объект HelloWorld дважды выполняет задачу Message: сначала отображает сообщение "Hello", а затем — "World".
Построение целевого объекта
Запустите MSBuild из командной сроки Visual Studio, чтобы построить целевой объект HelloWorld, определенный выше.Используйте параметр команды /target или /t, чтобы выбрать целевой объект.
Примечание |
---|
В следующих разделах под командным окном мы будем подразумевать командное окно Visual Studio. |
Чтобы построить целевой объект
Нажмите кнопку Пуск и щелкните Все программы.Найдите и щелкните Командная строка Visual Studio в папке Набор средств Visual Studio.
В командном окне перейдите в папку с файлом проекта, в этом случае — D:\BuildApp\BuildApp.
Запустите msbuild с параметром /t:HelloWorld.При этом будет выбран и построен целевой объект HelloWorld:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте выходные данные в командном окне.Должны отображаться две строки "Hello" и "World":
Hello World
Примечание |
---|
Если вместо них отображается The target "HelloWorld" does not exist in the project , возможно, файл проекта не был сохранен в редакторе кода.Сохраните файл и повторите попытку. |
С помощью редактора кода и командного окна можно изменять файл проекта и сразу же видеть результаты изменений.
Примечание |
---|
Если запустить команду msbuild без параметра /t, она построит целевой объект, предоставленный атрибутом DefaultTarget элемента Project, в этом случае "Build".При этом выполняется построение приложения Windows Forms BuildApp.exe. |
Свойства построения
Свойства построения — это пары "имя-значение", управляющие построением.В начале файла проекта уже определены некоторые свойства построения:
<PropertyGroup>
...
<ProductVersion>10.0.11107</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{30E3C9D5-FD86-4691-A331-80EA5BA7E571}</ProjectGuid>
<OutputType>WinExe</OutputType>
...
</PropertyGroup>
Все свойства являются дочерними элементами PropertyGroup.Имя свойства представляет собой имя дочернего элемента, а значение свойства — это текстовый элемент дочернего элемента.Например:
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
определяет свойство под названием TargetFrameworkVersion, присваивая ему строковое значение "v4.0".
Свойства построения можно переопределить в любое время.If
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
далее в файле проекта или в файле, позже импортированном в файл проекта, TargetFrameworkVersion принимает новое значение "v3.5".
Анализ значения свойства
Чтобы проанализировать значение свойства, следует использовать следующий синтаксис, где PropertyName — это имя свойства:
$(PropertyName)
С помощью этого синтаксиса проанализируйте некоторые свойства в файле проекта.
Чтобы проанализировать значение свойства
В редакторе кода замените целевой объект HelloWorld следующим кодом:
<Target Name="HelloWorld"> <Message Text="Configuration is $(Configuration)" /> <Message Text="MSBuildToolsPath is $(MSBuildToolsPath)" /> </Target>
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должны отображаться следующие две строки (версия .NET Framework может быть другой):
Configuration is Debug MSBuildToolsPath is C:\Windows\Microsoft.NET\Framework\v4.0.20317
Примечание |
---|
Если эти строки не отображаются, возможно, файл проекта не был сохранен в редакторе кода.Сохраните файл и повторите попытку. |
Условные свойства
Многие свойства, например Configuration (Конфигурация), задаются условно, т.е. атрибут Condition (Условие) появляется в элементе свойства.Условные свойства определяются или переопределяются, только если условие — true.Следует обратить внимание, что неопределенным свойствам по умолчанию присваивается значение пустой строки.Например:
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
означает: "Если свойство Configuration еще не определено, определите его и присвойте значение "Debug".
Практически у всех элементов MSBuild может быть атрибут Condition.Дополнительные сведения об использовании атрибута Condition см. в разделе Условия MSBuild.
Зарезервированные свойства
В MSBuild некоторые имена свойств резервируются для сохранения информации о файле проекта и двоичных файлах MSBuild.MSBuildToolsPath является примером зарезервированного свойства (новая возможность в MSBuild 3.5).В ссылках на зарезервированные свойства используется обозначение $, как и для любых других свойств.Дополнительные сведения см. в разделах Практическое руководство. Использование ссылки на имя или расположение файла проекта и Зарезервированные свойства MSBuild.
Переменные среды
Ссылки на переменные среды в файлах проектов выполняются так же, как ссылки на свойства построения.Например, чтобы использовать переменную среды в файле проекта, укажите $(Path).Если в файле проекта содержится определение свойства, имя которого совпадает с переменной среды, свойство из файла проекта переопределяет значение переменной среды.Дополнительные сведения см. в разделе Практическое руководство. Использование переменных среды в построении.
Задание свойств из командной строки
Свойства можно определять из командной строки с помощью параметра /property или /p.Значения свойств, полученные из командной строки, переопределяют значения свойств, заданные в файле проекта и переменных среды.
Чтобы задать значение свойства из командной строки
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld /p:Configuration=Release
Проанализируйте результат.Должна отобразиться следующая строка:
Configuration is Release.
MSBuild создает свойство Configuration и присваивает ему значение "Release".
Специальные символы
Некоторые знаки имеют специальное значение в файлах проекта MSBuild.Примерами таких знаков являются точка с запятой (;) и звездочка (*).Чтобы использовать эти специальные знаки в качестве литералов в файле проекта, их необходимо задать, используя синтаксис %xx, где xx представляет собой шестнадцатеричное ASCII-значение этого символа.
Измените задачу Message, чтобы отобразить значение свойства Configuration со специальными знаками для удобства чтения.
Чтобы использовать специальные знаки в задаче Message
В редакторе кода замените задачи Message следующей строкой:
<Message Text="%24(Configuration) is %22$(Configuration)%22" />
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должна отобразиться следующая строка:
$(Configuration) is "Debug"
Дополнительные сведения см. в разделе Специальные символы в MSBuild.
Элементы построения
Элемент представляет собой данные, как правило, имя файла, используемые в качестве входных данных для системы построения.Например, коллекцию элементов, представляющую исходные файлы, можно передать задаче под названием Compile (Компилировать), чтобы скомпилировать эти элементы в сборку.
Все элементы являются дочерними элементами ItemGroup.Имя элемента представляет собой имя дочернего элемента, а значение элемента — это значение атрибута Include (Включить) дочернего элемента.Значения элементов с одинаковым именем собираются в типы элементов с этим именем.Например:
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
определяет группу элементов с двумя элементами.Тип элемента Compile имеет два значения: "Program.cs" и "Properties\AssemblyInfo.cs".
С помощью следующего кода тот же тип элементов создается посредством объявления обоих файлов (разделенных точкой с запятой) в одном атрибуте Include.
<ItemGroup>
<Compile Include="Program.cs;Properties\AssemblyInfo.cs" />
</ItemGroup>
Дополнительные сведения см. в разделе Элементы MSBuild.
Примечание |
---|
Пути к файлам относительны папки с файлом проекта MSBuild. |
Анализ значений типа элементов
Чтобы получить значения типа элементов, следует использовать следующий синтаксис, где ItemType — это имя типа элементов:
@(ItemType)
С помощью этого синтаксиса проанализируйте тип элемента Compile в файле проекта.
Чтобы проанализировать значения типа элементов
В редакторе кода замените задачу HelloWorld следующим кодом:
<Target Name="HelloWorld"> <Message Text="Compile item type contains @(Compile)" /> </Target>
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должна отобразиться следующая длинная строка:
Compile item type contains Form1.cs;Form1.Designer.cs;Program.cs;Properties\AssemblyInfo.cs;Properties\Resources.Designer.cs;Properties\Settings.Designer.cs
По умолчанию значения типа элементов отделяются точкой с запятой.
Чтобы изменить разделитель типа элементов, следует использовать следующий синтаксис, где ItemType — это тип элемента, а Separator — это строка из одного или нескольких разделительных знаков:
@(ItemType, Separator)
Измените задачу Message, чтобы для отображения элементов Compile по одному в строке использовались символы возврата каретки и перевода строки (%0A%0D).
Чтобы отобразить значения типа элементов по одному в строке
В редакторе кода замените задачу Message следующей строкой:
<Message Text="Compile item type contains @(Compile, '%0A%0D')" />
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должны отобразиться следующие строки:
Compile item type contains Form1.cs Form1.Designer.cs Program.cs Properties\AssemblyInfo.cs Properties\Resources.Designer.cs Properties\Settings.Designer.cs
Атрибуты Include и Exclude и подстановочные знаки
Для добавления элементов в тип элемента можно использовать подстановочные знаки "*", "**" и "?" с атрибутом Include.Например:
<Photos Include="images\*.jpeg" />
добавляет все файлы с расширением JPEG в папке изображений в тип элементов Photos (Фотографии), а
<Photos Include="images\**.jpeg" />
добавляет все файлы с расширением JPEG в папке изображений и всех ее подпапках в тип элементов Photos.Дополнительные примеры см. в разделе Практическое руководство. Выбор файлов для построения.
Следует обратить внимание, что поскольку элементы объявлены, они добавляются в тип элементов.Например:
<Photos Include="images\*.jpeg" />
<Photos Include="images\*.gif" />
создает тип элемента под названием Photo (Фотография), содержащий все файлы в папке изображений с расширением JPEG или GIF.Этот код аналогичен следующей строке:
<Photos Include="images\*.jpeg;images\*.gif" />
С помощью атрибута Exclude (Исключить) можно исключить элемент из типа элементов.Например:
<Compile Include="*.cs" Exclude="*Designer*">
добавляет все файлы с расширением CS в тип элементов Compile кроме файлов, имена которых содержат строку "Designer".Дополнительные примеры см. в разделе Практическое руководство. Исключение файлов из построения.
Атрибут Exclude применяется только к элементам, добавленным с помощью атрибута Include в элемент, содержащий оба этих атрибута.Например:
<Compile Include="*.cs" />
<Compile Include="*.res" Exclude="Form1.cs">
файл Form1.cs, добавленный в предыдущем элементе, не будет исключен.
Чтобы включить и исключить элементы
В редакторе кода замените задачу Message следующей строкой:
<Message Text="Compile item type contains @(XFiles)" />
Добавьте эту группу элементов непосредственно после элемента Import:
<ItemGroup> <XFiles Include="*.cs;properties/*.resx" Exclude="*Designer*" /> </ItemGroup>
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должна отобразиться следующая строка:
Compile item type contains Form1.cs;Program.cs;Properties/Resources.resx
Метаданные элементов
Помимо сведений из атрибутов Include и Exclude в элементах могут также содержаться метаданные.Эти метаданные могут использоваться в задачах, для которых требуются дополнительные сведения об элементах, а не только значение элемента.
Для объявления метаданных элементов в файле проекта создается элемент с именем метаданных, являющийся дочерним по отношению к элементу, содержащему эти метаданные.Элемент может содержать ноль или более значений метаданных.Например, следующий элемент CSFile содержит метаданные Culture (Культура) со значением "Fr":
<ItemGroup>
<CSFile Include="main.cs">
<Culture>Fr</Culture>
</CSFile>
</ItemGroup>
Чтобы получить значение метаданных типа элементов, следует использовать следующий синтаксис, где ItemType — это имя типа элементов, а MetaDataName — имя метаданных.
%(ItemType.MetaDataName)
Чтобы проанализировать метаданные элементов
В редакторе кода замените задачу Message следующей строкой:
<Message Text="Compile.DependentUpon: %(Compile.DependentUpon)" />
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должны отобразиться следующие строки:
Compile.DependentUpon: Compile.DependentUpon: Form1.cs Compile.DependentUpon: Resources.resx Compile.DependentUpon: Settings.settings
Следует обратить внимание на то, что фраза "Compile.DependentUpon" отображается несколько раз.Использование метаданных с таким синтаксисом в рамках целевого объекта становится причиной пакетной обработки.Пакетная обработка — это процесс, при котором задачи в рамках одного целевого файла выполняются по одному разу для каждого уникального значения метаданных.Это аналог скрипта MSBuild общей программной конструкции "for loop".Дополнительные сведения см. в разделе Пакетная обработка в MSBuild.
Стандартные метаданные
При каждом добавлении элемента в список элементов ему присваиваются некоторые стандартные метаданные.Например, %(Filename) возвращает имя файла любого элемента.Полный список стандартных метаданных элементов см. в разделе Общеизвестные метаданные элементов MSBuild.
Чтобы проанализировать стандартные метаданные
В редакторе кода замените задачу Message следующей строкой:
<Message Text="Compile Filename: %(Compile.Filename)" />
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должны отобразиться следующие строки:
Compile Filename: Form1 Compile Filename: Form1.Designer Compile Filename: Program Compile Filename: AssemblyInfo Compile Filename: Resources.Designer Compile Filename: Settings.Designer
Сравнив два примера выше, можно увидеть, что хотя не у каждого элемента в типе элементов Compile имеются метаданные DependentUpon, однако у всех элементов есть стандартные метаданные Filename (Имя файла).
Преобразование метаданных
Списки элементов можно преобразовать в новые списки элементов.Чтобы преобразовать список элементов, следует использовать следующий синтаксис, где ItemType — это имя типа элементов, а MetaDataName — имя метаданных.
@(ItemType -> '%(MetadataName)')
Например, коллекцию списков, состоящую из исходных файлов, можно преобразовать в коллекцию объектных файлов с помощью выражения @(SourceFiles -> '%(Filename).obj').Дополнительные сведения см. в разделе Преобразования MSBuild.
Чтобы преобразовать элементы с помощью метаданных
В редакторе кода замените задачу Message следующей строкой:
<Message Text="Backup files: @(Compile->'%(filename).bak')" />
Сохраните файл проекта.
Введите и выполните следующую строку в командном окне:
msbuild buildapp.csproj /t:HelloWorld
Проанализируйте результат.Должна отобразиться следующая строка:
Backup files: Form1.bak;Form1.Designer.bak;Program.bak;AssemblyInfo.bak;Resources.Designer.bak;Settings.Designer.bak
Следует обратить внимание, что выраженные в этом синтаксисе метаданные не становятся причиной пакетной обработки.
Что дальше?
Сведения о пошаговом создании простого файла проекта см. в разделе Пошаговое руководство. Создание файла проекта MSBuild с нуля.