Что делает Microsoft.Common.props - PullRequest
0 голосов
/ 27 апреля 2018

Я заметил, что при создании проекта с использованием шаблона библиотеки классов .csproj содержит импорт Microsoft.Common.props

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

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

Так что же делает Microsoft.Common.props? Как это приносит пользу проекту?

1 Ответ

0 голосов
/ 28 апреля 2018

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

На самом деле существует два важных импорта для «стандартных» проектов .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 по умолчанию и логике также часто используется в пользовательских расширениях сборки и соглашении об именах для файлов msbuild, которые должны импортироваться сверху (.props) и снизу (* 1031). *) проектов.

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

...