Compartilhar via


Personalizar o build de solução

Quando o MSBuild compila um arquivo de solução, ele primeiro se converte internamente em um arquivo de projeto e, em seguida, compila isso. O arquivo de projeto gerado importa before.{solutionname}.sln.targets antes de definir quaisquer destinos e after.{solutionname}.sln.targets após importar 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 do projeto.

Importante

A personalização do build de solução dessa maneira aplica-se apenas a builds de linha de comando com o MSBuild.exe. 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 os arquivos Directory.Build.props e Directory.build.targets na pasta da solução, conforme discutido em outro momento neste artigo.

Quando você tem vários arquivos de solução que deseja estender da mesma maneira, mas não quer gravar na pasta $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ (que geralmente requer permissões elevadas), poderá 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 de solução e Directory.Solution.targets é importado no final do build de solução. Quando você compila 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 se importam implicitamente.

Quando você tem Directory.Solution.props ou Directory.Solution.targets em uma pasta raiz, mas tem uma solução nessa pasta que não deseja importar, 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 falsa. 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.