Что делает Microsoft.Общий.реквизит есть


Я заметил, что когда я создаю проект, используя шаблон библиотеки классов.csproj содержит импорт Microsoft.Общий.реквизит

<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props')" />

Однако, когда я создаю проект с использованием шаблона проекта модульного тестирования, его нет.

Так что же делает Microsoft.Общий.реквизит делать? Какую пользу это приносит проекту?

1 4

1 ответ:

Он делает много вещей и вносит часть логики сборки.

На самом деле существует два важных импорта для "стандартных" проектов .NET: Microsoft.Common.props и Microsoft.Common.targets (последний может быть неявно включен из файла импорта конкретного типа проекта).

Основная идея состоит в том, чтобы разделить логику сборки на две части: одну, которая импортируется до содержания вашего проекта (которая будет .props), и другую, которая включается позже (.targets).

Microsoft.Common.props определит некоторые свойства на основе соглашений-например, установить значения по умолчанию для текущей конфигурации (например, build for Debug, если при сборке из командной строки конфигурация не была указана).

Он также импортирует другие файлы, установленные в качестве расширений для установки MSBuild / vs tools или проекта-например, NuGet 4+ использует это для проектов стиля PackageReference.

Как только импорт Microsoft.Common.props настроит все значения по умолчанию, настанет очередь вашего проекта изменить значения по умолчанию в соответствии с выбором пользователя (и проектом шаблоны), а также определить некоторые другие свойства и элементы, необходимые для процесса сборки.

Затем ваш проект должен импортировать файл .targets, который определяет логику msbuild, необходимую для выполнения сборки проекта. Это делается через Microsoft.Common.targets (и файлы, которые он выбирает для импорта). Все, что должно переопределять логику, исходящую из этого файла, должно быть указано после этого импорта - вот почему шаблоны проектов VS имеют закомментированную область для пользовательских целей AfterBuild. Так как AfterBuild уже определенный через общие цели, вам нужно будет переопределить его после этого импорта (или использовать пользовательское имя и добавить AfterTargets="AfterBuild", что предпочтительно в более новых версиях MSBuild).

.props/.targets split for defaults and logic также часто используется в пользовательских расширениях сборки и Соглашении об именовании для файлов msbuild, которые должны быть импортированы в верхнюю (.props) и нижнюю (.targets) части проектов.

В проектах, основанных на SDK, которые были введены для .NET Core, но также могут использоваться с .NET Фреймворк, эта концепция расширяется путем импорта Sdk.props и Sdk.targets файлов - до и после содержимого проекта соответственно. Набор соглашений помогает найти эти файлы и даже позволяет опустить элементы <Import>, указав атрибут в файле проекта: <Project Sdk="Microsoft.NET.Sdk">...</Project>. Эти импорта будут определять даже больше значений по умолчанию, чем Microsoft.Common.props, что позволяет создавать очень маленькие и более удобочитаемые файлы проекта. (в настоящее время только .NET Core / .NET Standard и ASP.NET шаблоны основных проектов используют этот формат с тех пор VS 2017 использует для этого другую проектную систему, чем для классических файлов csproj)