Что делает Microsoft.Общий.реквизит есть
Я заметил, что когда я создаю проект, используя шаблон библиотеки классов.csproj содержит импорт Microsoft.Общий.реквизит
<Import Project="$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)$(MSBuildToolsVersion)Microsoft.Common.props')" />
Однако, когда я создаю проект с использованием шаблона проекта модульного тестирования, его нет.
Так что же делает Microsoft.Общий.реквизит делать? Какую пользу это приносит проекту?
1 ответ:
Он делает много вещей и вносит часть логики сборки.
На самом деле существует два важных импорта для "стандартных" проектов .NET:
Основная идея состоит в том, чтобы разделить логику сборки на две части: одну, которая импортируется до содержания вашего проекта (которая будетMicrosoft.Common.props
иMicrosoft.Common.targets
(последний может быть неявно включен из файла импорта конкретного типа проекта)..props
), и другую, которая включается позже (.targets
).
Microsoft.Common.props
определит некоторые свойства на основе соглашений-например, установить значения по умолчанию для текущей конфигурации (например, build forDebug
, если при сборке из командной строки конфигурация не была указана).Он также импортирует другие файлы, установленные в качестве расширений для установки 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)