Руководство. Использование MSBuild
MSBuild является платформой сборки для корпорации Майкрософт и Visual Studio. В этом руководстве описаны стандартные блоки MSBuild и показано, как писать, управлять и отлаживать проекты MSBuild. Здесь содержатся сведения о:
создание файла проекта и работа с ним;
Использование свойств сборки.
использование элементов сборки.
MSBuild можно запустить в Visual Studio или из командного окна. В этом руководстве вы создадите файл проекта MSBuild с помощью Visual Studio. Вы отредактируете файл проекта в Visual Studio и с помощью командного окна выполните сборку проекта и просмотрите результаты.
Установка MSBuild
Если у вас есть Visual Studio, то MSBuild уже установлен. В Visual Studio 2019 и последующих средства сборки устанавливаются в папку установки Visual Studio. Для обычной установки по умолчанию в Windows 10 файл MSBuild.exe находится в папке установки MSBuild\Current\Bin.
Убедитесь, что в установщике выбраны средства MSBuild для используемых рабочих нагрузок, затем нажмите кнопку Установить.
Чтобы установить MSBuild в системе без Visual Studio, см. раздел Средства сборки для Visual Studio 2019 или установите пакет SDK для .NET.
Если у вас есть Visual Studio, то MSBuild уже установлен. В Visual Studio 2022 средства сборки устанавливаются в папку установки Visual Studio. Для обычной установки по умолчанию в Windows 10 файл MSBuild.exe находится в папке установки MSBuild\Current\Bin.
В установщике Visual Studio перейдите в раздел Отдельные компоненты и найдите флажок для MSBuild. Он автоматически выбирается при выборе любой другой рабочей нагрузки для установки.
Чтобы установить MSBuild в системе без Visual Studio, см. раздел "Средства сборки для Visual Studio 2022" на странице загрузок. Другой способ получить MSBuild — установить пакет SDK для .NET.
Создание проекта MSBuild
Система проектов Visual Studio основана на MSBuild. Легко создать новый файл проекта с помощью Visual Studio. В этом разделе описано, как создать файл проекта C#. Вместо него можно выбрать создание файла проекта Visual Basic. В контексте этого руководства разница между двумя файлами проекта является незначительным.
Создание файла проекта
Откройте Visual Studio и создайте проект.
В поле поиска введите
winforms
и нажмите кнопку "Создать новое приложение Windows Forms" (платформа .NET Framework). В появившемся диалоговом окне выберите Создать.В поле Имя проекта введите
BuildApp
. Введите расположение решения, например D:\.Щелкните ОК или Создать, чтобы создать файл проекта.
Анализ файла проекта
В предыдущем разделе вы использовали Visual Studio для создания файла проекта C#. Файл проекта представлен в обозревателе решений узлом проекта с именем BuildApp. Чтобы проанализировать файл проекта, можно использовать редактор кода Visual Studio.
Анализ файла проекта
В обозревателе решений выберите узел проекта BuildApp.
В браузере Свойства обратите внимание, что свойство Файл проекта имеет значение BuildApp.csproj. В именах всех файлов проектов указан суффикс proj. Если вы создали проект Visual Basic, файлу проекта будет задано имя BuildApp.vbproj.
Еще раз щелкните правой кнопкой мыши узел проекта, а затем выберите Изменить BuildApp.csproj.
Файл проекта откроется в редакторе кода.
Примечание.
Для некоторых типов проектов, например C++, необходимо выгрузить проект, прежде чем можно будет открыть и изменить файл проекта. Чтобы выгрузить проект, щелкните правой кнопкой мыши файл проекта и выберите Выгрузить проект.
Целевые объекты и задачи
Файлы проекта представляют собой файлы в формате XML с корневым узлом Проект.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Большинство проектов .NET имеют Sdk
атрибут. Эти проекты называются проектами в стиле SDK.
<Project Sdk="Microsoft.NET.Sdk">
Существует множество вариантов пакетов SDK для .NET для специальных целей; Они описаны в пакетах SDK для проекта .NET.
Создание приложения выполняется с помощью элементов Целевой объект и Задача.
Задача — это наименьшая единица работы или, другими словами, атом сборки. Задачи являются независимыми исполняемыми компонентами, которые могут иметь входные и выходные данные. Сейчас в проекте отсутствуют определенные задачи или задачи, на которые существуют ссылки. Задачи добавляются в файл проекта в следующих разделах. Дополнительные сведения см. в статье о задачах.
Целевой объект представляет собой именованную последовательность задач. Дополнительные сведения см. в статье о целевых объектах.
[это может быть именованная последовательность задач, но крайне важно то, что она представляет собой что-то, что должно быть создано или выполнено, поэтому ее необходимо определить с помощью подхода, ориентированного на цели]
Целевой объект по умолчанию не определен в файле проекта. Вместо этого он указан в импортированных проектах. Элемент Import указывает импортированные проекты. Например, в проекте C# целевой объект по умолчанию импортируется из файла Microsoft.CSharp.targets.
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Импортированные файлы эффективно вставляются в файл проекта, где бы они ни ссылались.
В проектах в стиле SDK вы не увидите этого элемента Import, так как атрибут SDK приводит к неявному импорту этого файла.
MSBuild отслеживает целевые объекты сборки и гарантирует, что каждый целевой объект будет построен не более одного раза.
Добавление целевого объекта и задачи
Добавьте целевой объект в файл проекта. Добавьте задачу в целевой объект, который печатает сообщение.
Добавление целевого объекта и задачи
Добавьте следующие строки в файл проекта сразу после инструкции Import или после начала элемента Project.
<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", а затем отображает "Мир".
Создание целевого объекта
Если вы пытаетесь создать этот проект из Visual Studio, он не создает определенный целевой объект. Это связано с тем, что Visual Studio выбирает целевой объект по умолчанию, который по-прежнему находится в импортированном .targets
файле.
Запустите MSBuild из командной строки разработчика для Visual Studio, чтобы создать целевой объект HelloWorld, определенный ранее. Используйте параметр -target или -t для выбора целевого объекта.
Примечание.
Мы будем ссылаться на командную строку разработчика в качестве командного окна в следующих разделах.
Создание целевого объекта
Откройте командное окно.
В поле поиска на панели задач начните вводить имя средства, например
dev
илиdeveloper command prompt
. Откроется список установленных приложений, которые соответствуют вашему шаблону поиска.Если его нужно найти вручную, файл — LaunchDevCmd.bat в папке {Папка установки Visual Studio}\Common7\Tools .
В командном окне перейдите в папку, содержащую файл проекта. В данном случае это 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
, возможно, вы забыли сохранить файл проекта в редакторе кода. Сохраните файл и повторите попытку.
Переключаясь между редактором кода и командной строкой, можно изменять файл проекта и сразу же видеть результаты.
Свойства сборки
Свойства сборки являются парами "имя — значение", управляющими сборкой. В верхней части файла проекта уже определено несколько свойств сборки:
<PropertyGroup>
...
<ProductVersion>10.0.11107</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{30E3C9D5-FD86-4691-A331-80EA5BA7E571}</ProjectGuid>
<OutputType>WinExe</OutputType>
...
</PropertyGroup>
Все свойства являются дочерними элементами по отношению к элементам PropertyGroup. Имя свойства — это имя дочернего элемента, а значение свойства — это текстовый элемент дочернего элемента. Например:
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
определяет свойство TargetFrameworkVersion, указывающее строковое значение версии 4.5.
Свойства сборки можно переопределять в любое время. 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
Изучите выходные данные. Вы должны увидеть эти две строки (выходные данные могут отличаться):
Configuration is Debug MSBuildToolsPath is C:\Program Files\Microsoft Visual Studio\2022\MSBuild\Current\Bin\amd64
Configuration is Debug MSBuildToolsPath is C:\Program Files (x86)\Microsoft Visual Studio\2019\MSBuild\16.0\Bin
Условные свойства
Многие свойства, например Configuration
, определяются условно, то есть в элементе свойства отображается атрибут Condition
. Условные свойства определяются или переопределяются только в том случае, если условие оценивается как true. Неопределенные свойства задают значение по умолчанию пустой строки. Например:
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
значение "Если свойство конфигурации еще не определено, определите его и присвойте ему значение "Отладка".
Атрибут Condition может быть почти у всех элементов MSBuild. Дополнительные сведения об использовании атрибута Condition см. в статье об условиях.
Зарезервированные свойства
MSBuild резервирует некоторые имена свойств для хранения сведений о файле проекта и двоичных файлах MSBuild. Примером зарезервированного свойства является MSBuildToolsPath. Зарезервированные свойства указываются с символом $, как и любое другое свойство. Дополнительные сведения см. в статьях Практическое руководство. Использование ссылки на имя или расположение файла проекта и Зарезервированные и стандартные свойства MSBuild.
Переменные среды
Ссылаться на переменные среды в файлах проектов можно так же, как на свойства сборки. Например, чтобы использовать переменную среды PATH в файле проекта, примените $(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, даже если файл проекта является импортированным. Существует несколько исключений, например при использовании элементов Import и UsingTask.
Анализ значений типа элемента
Чтобы получить значения типа элемента, используйте следующий синтаксис, где 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 для использования символов возврата каретки и перевода строки (%0A%0D) для отображения элементов Compile по одному в строке.
Отображение значений типов элементов по одному в строке
В редакторе кода замените задачу 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="XFiles item type contains @(XFiles)" />
Добавьте эту группу элементов сразу после элемента Import:
<ItemGroup> <XFiles Include="*.cs;properties/*.resx" Exclude="*Designer*" /> </ItemGroup>
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
msbuild buildapp.csproj -t:HelloWorld
Изучите выходные данные. Вы должны увидеть следующую строку:
XFiles 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, эквивалентный общей конструкции программирования foreach. Дополнительные сведения см. в статье Пакетная обработка.
Стандартные метаданные
Всякий раз, когда элемент добавляется в список элементов, ему назначаются некоторые стандартные метаданные. Например %(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
По сравнению с предыдущими двумя примерами можно увидеть, что хотя не каждый элемент в типе элемента компиляции содержит метаданные Зависимого элемента, все элементы имеют известные метаданные имени файла.
Преобразования метаданных
Списки элементов могут быть преобразованы в новые списки элементов. Чтобы преобразовать список элементов, используйте следующий синтаксис, где <ItemType> — это имя типа элементов, а <MetadataName> — имя метаданных:
@(ItemType -> '%(MetadataName)')
Например, список элементов исходных файлов можно преобразовать в коллекцию объектных файлов с помощью выражения @(SourceFiles -> '%(Filename).obj')
. Дополнительные сведения см. в статье Преобразования.
Преобразование элементов с помощью метаданных
В редакторе кода замените задачу 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
Обратите внимание, что метаданные, выраженные в этом синтаксисе, не вызывают пакетную обработку.
Следующие шаги
Чтобы узнать, как создать простой файл проекта один шаг за раз в Windows, попробуйте создать файл проекта MSBuild с нуля.
Если вы используете в основном пакет SDK для .NET, перейдите по ссылке MSBuild для проектов пакета SDK для .NET.