Настройка сборки решения
Когда система 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)
, чтобы указать другое расположение для этих файлов. Это может быть полезно, если у вас есть различные подмножества решений, требующие определенных значений свойств или целевых объектов, общих для подмножеств.