Что такое msbuild и для чего он нужен
MSBuild что это за программа и нужна ли она?
Если вы думаете как удалить MSBuild, то я этого не советую делать, а то могут возникнуть разные глюки через некоторое время. Могу дать совет — переименуйте папку например в …MSBuild_, поработайте пару дней за компом, если нет глюков можете удалить
Особого смысла писать подробно о том что за программа MSBuild нет, так как вряд ли вам будет интересно, это для программистов. Ну что интересно? Окей, тогда немного напишу. Вот смотрите, MSBuild запускается из командной строки таким образом — файл проекта передается модулю MSBuild.exe с определенными аргументами. В результате при помощи аргументов указываются свойства, задаются обьекты и средства для ведения журнала. Также этот модуль будет полезен для отображения в командной строке ошибок, предупреждений, сообщений.
Разработка приложения в проекте MSBuild при использовании среды разработки Visual Studio 2005:
Итак, какой можем сделать вывод о программе MSBuild?
Скорее всего папку вы нашли в \Program Files, но вот какая штука, в эту папку, пользуясь тем что это системный компонент, может также поселится и вирус. Но если вдруг подозреваете, что это вирус… то тут лучше сразу проверить компьютер онлайн сканером, если будут вирусы, то он их найдет и после проверки вы их сможете удалить.
Как видите, интересного мало, это системная программа и папку ее как бы не желательно удалять, тем более что если она просто простаивает — то она никому не мешает и не нагружает процессор вообще никак.
Так вот, по поводу вирусов, если думаете что они поселились на компе — то нет вопросов, проверьте сперва инструментом AdwCleaner, а потом пройдитесь сканером Eset, я о нем писал тут (во второй половине статьи!).
Расширение процесса сборки с помощью MSBuild
MSBuild устроен таким образом, что сборка проекта разбита на несколько этапов.
Target — это некоторый этап (событие), происходящее во время сборки проекта. Можно использовать стандартные таргеты, либо определять собственные.
Task — это некоторая задача, которая может выполняться на определенном этапе. Можно использовать стандартные таски или создавать собственные.
Targets group tasks together in a particular order and allow the build process to be factored into smaller units.
For example, one target may delete all files in the output directory to prepare for the build, while another
compiles the inputs for the project and places them in the empty directory.
Жизненный цикл сборки MSBuild (Меню)
Для работы MSBuild Microsoft определил ряд стандартных таргетов (в файлах Microsoft.Common.targets, Microsoft.CSharp.targets и т.д.). Определено огромное множество различных таргетов, но в данной статье мы не будем на этом подробно останавливаться. Некоторые стандартные таргеты (упорядочены):
Таргеты BeforeBuild и AfterBuild специально созданы для переопределения и их можно использовать. Остальные таргеты из списка не рекомендую использовать, чтобы ничего не сломалось.
Подготовка окружения для примеров (Меню)
Для примеров необходимо:
Результат будет выводиться в окно Output в Visual Studio (внизу). Если его нет, то откройте его через пункты меню View => Output.
Таргеты в MSBuild (Меню)
Для примеров будем использовать таск Message, который будет выводить информацию в окно Output в Visual Studio. Как говорилось ранее есть стандартные таргеты BeforeBuild и AfterBuild, воспользуемся ими. Про подготовку читать в разделе Подготовка окружения для примеров.
Результат выполнения (лишнее исключено):
Как видно, был выполнен task Message, который вывел указанный нами текст в момент BeforeBuild и AfterBuild в окно Output в Visual Studio.
При определении таргета с одним и тем же именем он перезаписывается!
Результат выполнения (лишнее исключено):
Создание собственного таргета MSBuild (Меню)
Если таргетов BeforeBuild и AfterBuild недостаточно или нужно, чтобы таски выполнялись на другом этапе жизненного цикла сборки, то можно определить собственный таргет. Для этих целей есть параметры BeforeTargets и AfterTargets.
Результат выполнения (лишнее исключено):
…
MyCustomBeforeTarget event
BeforeBuild event
MyCustomAfterTarget event
…
Было определено два собственных таргета — MyCustomBeforeTarget и MyCustomAfterTarget.
Таргет MyCustomBeforeTarget выполняется до таргета BeforeBuild, потому что мы указали:
Таргет MyCustomAfterTarget выполняется после таргета BeforeBuild, потому что мы указали:
Таски в MSBuild (Меню)
В данной статье не рассматривается как можно писать собственные таски, но прежде чем писать таск, ознакомьтесь со списком тасков, предоставляемых Microsoft.
Рассмотрим несколько примеров использования тасков и макросов.
A Boolean expression that the MSBuild engine uses to determine whether this task will be executed.
Если будет выбрана solution конфигурация Debug, то результат будет выглядеть так (лишнее исключено):
В примере выше у нас есть текст, который можно унифицировать. Чтобы исключить дублирование вынесем в отдельную переменную текст сообщения.
Для определения собственной переменной используется элемент PropertyGroup.
В данном примере сделаем таск, который проверяет создан ли файл App.Debug.config. Если он не создан, то выдаем ошибку. В случае ошибки билд будет остановлен и ошибка будет отображена как ошибки компиляции в окне Error List.
Используем для этого таск Error и уже знакомый нам параметр Condition.
Результат:
В данном примере будем использовать таск Copy. С помощью таска скопируем файл App.config в папку bin/[Configuration]/Config в два файла App.config и App.test.config.
Свойство SourceFiles — массив файлов, которые необходимо скачать. Указывать без кавычек, через точку с запятой.
Свойство DestinationFiles — массив файлов куда будут копироваться файлы. Указывать без кавычек, через точку с запятой.
Новые возможности в MSBuild 17.0
В этой статье описаны существенные обновления в MSBuild 17.0. Подробные заметки о выпуске см. в статье MSBuild 17.0.0.
Измененный путь
MSBuild устанавливается в папку \Current каждой версии Visual Studio, а исполняемые файлы находятся в подпапке \Bin. Например, путь к MSBuild.exe установленному с помощью сообщества Visual Studio 2022 — C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe. Для поиска MSBuild можно также использовать модуль PowerShell: vssetup.powershell.
Измененные свойства
В связи с выходом нового номера версии изменены следующие свойства MSBuild.
MSBuildToolsVersion для этой версии средств остается текущей. Версия сборки имеет такой же номер, как и в Visual Studio 2017 и Visual Studio 2019, т. е. 15.1.0.0.
VisualStudioVersion для этой версии средств имеет значение 17.0.
64-разрядная версия
В MSBuild.exe ранее поддерживались 32-разрядная и 64-разрядная версии, но теперь по умолчанию используется 64-разрядная. Visual Studio 2022 использует 64-разрядную версию MSBuild для всех сборок. 32-разрядная версия по-прежнему доступна, но мы рекомендуем переключать все сборки на 64-разрядную.
Для владельцев задач это означает, что когда MSBuild загружает задачу, он попытается загрузить ее в 64-разрядном процессе. Рекомендуется обновить задачи, чтобы они выполнялись в 64-разрядном процессе, но для совместимости можно указать, что задача выполняется только как 32-разрядная, в UsingTask.
Усовершенствования в области производительности
MSBuild работает быстрее. Основное внимание в этом выпуске направлено на повышение производительности во многих распространенных сценариях. MSBuild 17.0 может создавать более крупные проекты быстрее.
Журналы
Двоичные журналы меньше и содержат больше информации.
Критические изменения
Другие изменения в поведении
Дополнительные сведения об изменениях в этой версии см. в подробных заметках о выпуске.
Пошаговое руководство. Использование MSBuild
MSBuild является платформой сборки для корпорации Майкрософт и Visual Studio. Это практическое руководство содержит вводную информацию о стандартных блоках MSBuild и описывает способы записи и отладки проектов MSBuild, а также управления ими. Здесь рассматриваются следующие вопросы:
создание файла проекта и работа с ним;
использование свойств сборки;
использование элементов сборки.
MSBuild можно запустить в Visual Studio или из командного окна. В этом пошаговом руководстве вы создадите файл проекта MSBuild с помощью Visual Studio. Вы отредактируете файл проекта в Visual Studio и с помощью командного окна выполните сборку проекта и просмотрите результаты.
Установка MSBuild
Если у вас есть Visual Studio, то MSBuild уже установлен. Чтобы установить MSBuild 15 в системе, не имеющей Visual Studio, перейдите на страницу загрузки более ранних версий Visual Studio, разверните пункт Visual Studio 2017 и нажмите кнопку Загрузить. Если у вас есть подписка Visual Studio, выполните вход и найдите ссылку для загрузки последней версии Build Tools для Visual Studio 2017. Если у вас нет подписки Visual Studio, вы по-прежнему можете установить последнюю версию средств сборки. На этой странице с помощью средства выбора версии переключитесь на страницу для версии 2019 и следуйте инструкциям по установке.
Если у вас есть Visual Studio, то MSBuild уже установлен. В Visual Studio 2019 и последующих средства сборки устанавливаются в папку установки Visual Studio. Для обычной установки по умолчанию в Windows 10 файл MSBuild.exe находится в папке установки MSBuild\Current\Bin.
Убедитесь, что в установщике выбраны средства MSBuild для используемых рабочих нагрузок, затем нажмите кнопку Установить.
Если у вас есть Visual Studio, то MSBuild уже установлен. В Visual Studio 2022 средства сборки устанавливаются в папку установки Visual Studio. Для обычной установки по умолчанию в Windows 10 файл MSBuild.exe находится в папке установки MSBuild\Current\Bin.
В установщике Visual Studio перейдите в раздел Отдельные компоненты и найдите флажок для MSBuild. Он выбирается автоматически при выборе любой из других рабочих нагрузок для установки.
Создание проекта MSBuild
Система проектов Visual Studio основана на MSBuild. Это упрощает создание файла проекта с помощью Visual Studio. В этом разделе создается файл проекта Visual C#. Вместо него можно выбрать создание файла проекта Visual Basic. В контексте данного пошагового руководства различия между двумя файлами проекта незначительны.
Создание файла проекта
Откройте Visual Studio и создайте проект.
В поле поиска, введите winforms, затем выберите Create a new Windows Forms App (.NET Framework) (Создать новое приложение Windows Forms (.NET Framework)). В появившемся диалоговом окне выберите Создать.
Щелкните ОК или Создать, чтобы создать файл проекта.
Анализ файла проекта
В предыдущем разделе вы использовали Visual Studio для создания файла проекта Visual C#. Файл проекта представлен в обозревателе решений узлом проекта с именем BuildApp. Чтобы проанализировать файл проекта, можно использовать редактор кода Visual Studio.
Анализ файла проекта
В обозревателе решений выберите узел проекта BuildApp.
В браузере Свойства обратите внимание, что свойство Файл проекта имеет значение BuildApp.csproj. В именах всех файлов проектов указан суффикс proj. Если вы создали проект Visual Basic, файлу проекта будет задано имя BuildApp.vbproj.
Еще раз щелкните правой кнопкой мыши узел проекта, а затем выберите Изменить BuildApp.csproj.
Файл проекта откроется в редакторе кода.
Для некоторых типов проектов, например C++, необходимо выгрузить проект, прежде чем можно будет открыть и изменить файл проекта. Чтобы выгрузить проект, щелкните правой кнопкой мыши файл проекта и выберите Выгрузить проект.
Целевые объекты и задачи
Файлы проекта представляют собой файлы в формате XML с корневым узлом Проект.
Для проектов не в стиле SDK необходимо указать пространство имен xmlns в элементе «Проект». Если атрибут ToolsVersion присутствует в новом проекте, он должен соответствовать версии MSBuild. Если версия MSBuild вам неизвестна, вы можете получить ее из первых двух чисел в выходных данных следующей командной строки (например, 16.0):
Создание приложения выполняется с помощью элементов Целевой объект и Задача.
Задача — это наименьшая единица работы или, другими словами, атом сборки. Задачи являются независимыми исполняемыми компонентами, которые могут иметь входные и выходные данные. Сейчас в проекте отсутствуют определенные задачи или задачи, на которые существуют ссылки. Процедура добавления задач в файл проекта описывается в следующих разделах. Дополнительные сведения см. в статье о задачах.
Целевой объект представляет собой именованную последовательность задач. Дополнительные сведения см. в статье о целевых объектах.
[это может быть именованная последовательность задач, но крайне важно то, что она представляет собой что-то, что должно быть создано или выполнено, поэтому ее необходимо определить с помощью подхода, ориентированного на цели]
Целевой объект по умолчанию не определен в файле проекта. Вместо этого он задан в импортированных проектах. Элемент Import указывает импортированные проекты. Например, в проекте C# целевой объект по умолчанию импортируется из файла Microsoft.CSharp.targets.
Импортированные файлы вставляются в файл проекта везде, где на них указывает ссылка.
В проектах в стиле SDK вы не увидите этого элемента Import, так как атрибут SDK приводит к неявному импорту этого файла.
MSBuild отслеживает целевые объекты сборки и гарантирует, что каждый целевой объект будет построен не более одного раза.
Добавление целевого объекта и задачи
Добавьте целевой объект в файл проекта. Добавьте задачу в целевой объект, который выводит сообщение.
Добавление целевого объекта и задачи
Добавьте следующие строки в файл проекта сразу после инструкции Import или после начала элемента Project.
Будет создан целевой объект с именем HelloWorld. Обратите внимание, что во время редактирования файла проекта доступна поддержка IntelliSense.
Добавьте строки в целевой объект HelloWorld, чтобы в результате раздел выглядел следующим образом:
Сохраните файл проекта.
Задача Message является одной из многих, входящих в комплект поставки MSBuild. Полный список доступных задач и сведения об их использовании см. в статье Справочные сведения о задачах MSBuild.
Задача Message принимает строковое значение атрибута Text в качестве входных данных и отображает его в устройстве вывода (или записывает его в один или несколько журналов, если применимо). Целевой объект HelloWorld выполняет задачу Message дважды: сначала для отображения Hello, а затем для отображения World.
Создание целевого объекта
Если вы попытаетесь выполнить сборку этого проекта из Visual Studio, определенный вами целевой объект не будет создан. Это связано с тем, что Visual Studio выбирает целевой объект по умолчанию, а это по-прежнему тот объект, который находится в импортированном файле .targets.
В следующих разделах мы будем называть командную строку разработчика командным окном.
Создание целевого объекта
Откройте командное окно.
Если вам нужно найти средство вручную, найдите файл LaunchDevCmd.bat в папке \Common7\Tools.
В командном окне перейдите в папку, содержащую файл проекта. В данном случае это D:\BuildApp\BuildApp.
Изучите выходные данные в окне командной строки. Вы должны увидеть две строки — Hello и World:
Переключаясь между редактором кода и командной строкой, можно изменять файл проекта и сразу же видеть результаты.
Свойства сборки
Свойства сборки являются парами «имя — значение», управляющими сборкой. В верхней части файла проекта уже определено несколько свойств сборки:
Все свойства являются дочерними элементами по отношению к элементам PropertyGroup. Имя свойства — это имя дочернего элемента, а значение свойства — это текстовый элемент дочернего элемента. Например, примененная к объекту директива
определяет свойство с именем TargetFrameworkVersion, задавая ему строковое значение «v4.5».
Свойства сборки можно переопределить в любое время. If
появляется далее в файле проекта или в файле, позже импортированном в файл проекта, свойство TargetFrameworkVersion принимает новое значение v3.5.
Анализ значения свойства
Чтобы получить значение свойства, используйте следующий синтаксис, где PropertyName — имя свойства:
С помощью этого синтаксиса проанализируйте некоторые свойства в файле проекта.
Анализ значения свойства
В редакторе кода замените целевой объект HelloWorld следующим кодом:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Вы должны увидеть следующие две строки (ваши выходные данные могут отличаться):
Условные свойства
означает: «Если свойство Configuration еще не определено, определите его и присвойте ему значение Debug».
Атрибут Condition может быть почти у всех элементов MSBuild. Дополнительные сведения об использовании атрибута Condition см. в статье об условиях.
Зарезервированные свойства
Переменные среды
Задание свойств из командной строки
Настройка значения свойства из командной строки
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Вы должны увидеть следующую строку:
MSBuild создает свойство Configuration и присваивает ему значение Release.
Специальные символы
Измените задачу Message, чтобы отображать значение свойства Configuration со специальными символами для удобства чтения.
Использование специальных символов в задаче Message
В редакторе кода замените обе задачи Message следующей строкой:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Вы должны увидеть следующую строку:
Дополнительные сведения см. в статье Специальные символы в MSBuild.
Элементы сборки
Элемент — это часть данных, обычно имя файла, которая используется в качестве входных данных для системы сборки. Например, коллекцию элементов, представляющую исходные файлы, можно передать в задачу Compile, чтобы скомпилировать их в сборку.
Все элементы являются дочерними элементами по отношению к элементам ItemGroup. Именем элемента является имя дочернего элемента, а значением — значение атрибута Include дочернего элемента. Значения элементов с одинаковым именем собираются в типы элементов с таким именем. Например, примененная к объекту директива
определяет группу элементов, содержащую два элемента. Тип элемента Compile имеет два значения: Program.cs и Properties\AssemblyInfo.cs.
Следующий код создает тот же тип элементов посредством объявления обоих файлов в одном атрибуте Include, разделенных точкой с запятой.
Дополнительные сведения см. в разделе Элементы.
Пути к файлам задаются относительно папки, содержащей файл проекта MSBuild, даже если файл проекта является импортированным. Существует несколько исключений, например при использовании элементов Import и UsingTask.
Анализ значений типа элемента
Чтобы получить значения типа элемента, используйте следующий синтаксис, где ItemType — это имя типа элемента:
С помощью этого синтаксиса проанализируйте тип элемента Compile в файле проекта.
Анализ значений типа элемента
В редакторе кода замените целевую задачу HelloWorld следующим кодом:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Вы должны увидеть следующую строку:
По умолчанию значения типа элемента разделены точкой с запятой.
Чтобы изменить разделитель типа элемента, используйте следующий синтаксис, где ItemType — это тип элемента, а Separator — это строка из одного или нескольких разделительных символов:
Измените задачу Message для использования символов возврата каретки и перевода строки (%0A%0D) для отображения элементов Compile по одному в строке.
Отображение значений типов элементов по одному в строке
В редакторе кода замените задачу Message следующей строкой:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Должны отобразиться следующие строки:
Атрибуты Include, Exclude и подстановочные знаки
Можно использовать подстановочные знаки «*», «**» и «?» с атрибутом Include, чтобы добавить элементы к типу элемента. Например, примененная к объекту директива
добавляет все файлы с расширением файла .jpeg в папке изображений к типу элемента Photos, тогда как
добавляет все файлы с расширением файла .jpeg в папке изображений и всех ее вложенных папках к типу элемента Photos. Дополнительные примеры см. в статье Практическое руководство. Выбор файлов для сборки.
Обратите внимание, что, так как элементы объявлены, они добавляются к типу элемента. Например, примененная к объекту директива
создает тип элемента Photo, содержащий все файлы в папке изображений с расширением .jpeg или .gif. Это эквивалентно следующей строке:
С помощью атрибута Exclude можно исключить элемент из типа элемента. Например, примененная к объекту директива
добавляет все файлы с расширением .cs в тип элемента Compile, за исключением файлов, имена которых содержат строку Designer. Дополнительные примеры см. в статье Практическое руководство. Исключение файлов из сборки.
Атрибут Exclude применяется только к элементам, добавленным с помощью атрибута Include в элемент, содержащий их оба. Например, примененная к объекту директива
не исключит файл Form1.cs, добавленный в предыдущий элемент.
Включение и исключение элементов
В редакторе кода замените задачу Message следующей строкой:
Добавьте эту группу элементов сразу после элемента Import:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Вы должны увидеть следующую строку:
Метаданные элементов
Помимо сведений, собранных из атрибутов Include и Exclude, элементы могут содержать метаданные. Эти метаданные могут использоваться задачами, требующими дополнительных сведений об элементах, а не просто их значений.
Для объявления элементов в файле проекта создается элемент с именем метаданных, являющийся дочерним по отношению к элементу. Элемент может содержать нуль или более значений метаданных. Например, следующий элемент CSFile содержит метаданные Culture со значением Fr:
Чтобы получить значение метаданных типа элемента, используйте следующий синтаксис, где ItemType — это имя типа элементов, а MetaDataName — имя метаданных:
Анализ метаданных элементов
В редакторе кода замените задачу Message следующей строкой:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Должны отобразиться следующие строки:
Обратите внимание, что фраза Compile.DependentUpon появляется несколько раз. Использование метаданных с таким синтаксисом в целевом объекте приводит к пакетной обработке. Пакетная обработка означает, что задачи в целевом объекте выполняются один раз для каждого уникального значения метаданных. Это является эквивалентом скрипта MSBuild общей конструкции программирования for loop. Дополнительные сведения см. в статье Пакетная обработка.
Стандартные метаданные
Всякий раз, когда элемент добавляется в список элементов, ему назначаются некоторые стандартные метаданные. Например %(Filename) возвращает имя файла любого элемента. Полный список стандартных метаданных см. в статье Общеизвестные метаданные элементов MSBuild.
Анализ стандартных метаданных
В редакторе кода замените задачу Message следующей строкой:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Должны отобразиться следующие строки:
Сравнивая два приведенных выше примера, можно увидеть, что, хотя не у каждого элемента в типе элемента Compile имеются метаданные DependentUpon, у всех элементов есть стандартные метаданные Filename.
Преобразования метаданных
Списки элементов могут быть преобразованы в новые списки элементов. Чтобы преобразовать список элементов, используйте следующий синтаксис, где — это имя типа элементов, а — имя метаданных:
Преобразование элементов с помощью метаданных
В редакторе кода замените задачу Message следующей строкой:
Сохраните файл проекта.
В командном окне введите и выполните следующую строку:
Проанализируйте результат. Вы должны увидеть следующую строку:
Обратите внимание, что выраженные в этом синтаксисе метаданные не приводят к пакетной обработке.
Следующие шаги
Пошаговые инструкции по созданию файла простого проекта см. в статье Пошаговое руководство. Создание файла проекта MSBuild с нуля.