Partilhar via


Personalizar o build da solução

Quando o MSBuild cria um arquivo de solução, ele primeiro o converte internamente em um arquivo de projeto e, em seguida, o compila. O arquivo de projeto gerado importa before.{solutionname}.sln.targets antes de definir quaisquer destinos e after.{solutionname}.sln.targets após a importação de destinos, incluindo destinos instalados nos diretórios $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore e $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter.

Por exemplo, você pode definir um novo destino para gravar uma mensagem de log personalizada depois de compilar MyCustomizedSolution.sln criando um arquivo no mesmo diretório chamado after.MyCustomizedSolution.sln.targets que contém

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

O build da solução é separado dos builds do projeto, portanto, as configurações aqui não afetam os builds de projeto.

Importante

Personalizar a compilação da solução dessa maneira aplica-se somente a compilações de linha de comando com MSBuild.exe ou dotnet build. Isso não se aplica a builds dentro do Visual Studio. Por esse motivo, não é recomendável colocar a personalização no nível da solução. Uma alternativa melhor para personalizar todos os projetos em uma solução é usar Directory.Build.props e Directory.build.targets arquivos na pasta da solução, conforme discutido em outro lugar neste artigo.

Quando você tiver muitos arquivos de solução que deseja estender da mesma maneira, mas não quiser gravar na pasta $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ (que geralmente requer permissões elevadas), você pode criar os arquivos Directory.Solution.props e Directory.Solution.targets e colocá-los no caminho raiz acima dos arquivos de solução que você deseja estender. Directory.Solution.props é importado no início do build da solução e Directory.Solution.targets é importado no final do build da solução. Quando você cria um arquivo de solução, Directory.Build.props e Directory.Build.targets não são importados, portanto, você deve usar Directory.Solution.props e Directory.Solution.targets. Eles não importam implicitamente uns aos outros.

Quando você tiver Directory.Solution.props ou Directory.Solution.targets em uma pasta raiz, mas você tiver uma solução nessa pasta que não deseja importá-los, você pode usar os arquivos específicos da solução mencionados anteriormente before.{solutionname}.sln.targets e after.{solutionname}.sln.targets para definir as propriedades $(ImportDirectorySolutionProps) e $(ImportDirectorySolutionTargets) como false. Ou você pode usar as propriedades $(DirectorySolutionPropsPath) e $(DirectorySolutionTargetsPath) para especificar um local diferente para esses arquivos. Isso pode ser útil se você tiver vários subconjuntos de suas soluções que exigem determinados valores de propriedade ou destinos comuns aos subconjuntos.