Настройка сборки решения

Когда система MSBuild выполняет сборку файла решения, она сначала внутренне преобразует его в файл проекта и затем выполняет его сборку. Созданный файл проекта импортирует before.{solutionname}.sln.targets до определения каких-либо целевых объектов и after.{solutionname}.sln.targets после их импорта, включая целевые объекты, установленные в каталоги $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore и $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter.

Например, можно определить новый целевой объект для записи настраиваемого сообщения журнала после сборки MyCustomizedSolution.sln, создав в том же каталоге файл after.MyCustomizedSolution.sln.targets, содержащий следующее:

<Project>
 <Target Name="EmitCustomMessage" AfterTargets="Build">
   <Message Importance="High" Text="The solution has completed the Build target" />
 </Target>
</Project>

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

Важно!

Подобная настройка сборки решения применяется только к сборкам из командной строки с MSBuild.exe. Она не применяется к сборкам внутри Visual Studio. По этой причине не рекомендуется размещать настройки на уровне решения. Лучшим вариантом для настройки всех проектов в решении является использование файлов Directory.Build.props и Directory.Build.targets в папке решения, как описано в других разделах этой статьи.

Если у вас есть много файлов решения, которые вы хотите расширить таким же образом, но не хотите записывать в папку $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ (для чего обычно требуются повышенные разрешения), то вы можете создать файлы Directory.Solution.props и Directory.Solution.targets и поместить их в корневой путь над файлами решения, которые вы хотите расширить. Directory.Solution.props импортируется в начале сборки решения, а Directory.Solution.targets — в конце сборки решения. При сборке файла решения файлы Directory.Build.props и Directory.Build.targets не импортируются, поэтому вместо них необходимо использовать Directory.Solution.props и Directory.Solution.targets. Они неявно импортируют друг друга.

Если у вас в корневой папке имеется файл Directory.Solution.props или Directory.Solution.targets, но под этой папкой есть решение, которое вы не хотите импортировать, вы можете с помощью упомянутых выше файлов before.{solutionname}.sln.targets и after.{solutionname}.sln.targets, относящихся к решению, задать для свойств $(ImportDirectorySolutionProps) и $(ImportDirectorySolutionTargets) значение false. Кроме того, можно использовать свойства $(DirectorySolutionPropsPath) и $(DirectorySolutionTargetsPath), чтобы указать другое расположение для этих файлов. Это может быть полезно, если у вас есть различные подмножества решений, требующие определенных значений свойств или целевых объектов, общих для подмножеств.