Compartir a través de


Personalización de la compilación de la solución

Cuando MSBuild compila un archivo de solución, primero lo convierte internamente en un archivo de proyecto y, después, lo compila. El archivo de proyecto generado importa before.{solutionname}.sln.targets antes de definir los destinos y after.{solutionname}.sln.targets después de importarlos, incluidos los destinos instalados en los directorios $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore y $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter.

Por ejemplo, se podría definir un destino nuevo para escribir un mensaje de registro personalizado después de compilar MyCustomizedSolution.sln mediante la creación de un archivo en el mismo directorio denominado after.MyCustomizedSolution.sln.targets que contiene

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

La compilación de la solución es independiente de las compilaciones del proyecto, por lo que la configuración aquí no afecta a las compilaciones del proyecto.

Importante

La personalización de la compilación de la solución de este modo solo se aplica a las compilaciones de línea de comandos con MSBuild.exe. No se aplica a las compilaciones dentro de Visual Studio. Por esta razón, no se recomienda aplicar personalización en el nivel de la solución. Una alternativa mejor para personalizar todos los proyectos de una solución es usar Directory.Build.props y Directory.build.targets en la carpeta de la solución, como se describe en otro lugar de este artículo.

Cuando tiene muchos archivos de solución que desea extender de la misma manera, pero no desea escribir en la carpeta $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ (que normalmente requiere permisos elevados), puede crear los archivos Directory.Solution.props y Directory.Solution.targets y colocarlos en la ruta de acceso raíz encima de los archivos de solución que desea extender. Directory.Solution.props se importa al principio de la compilación de la solución y Directory.Solution.targets se importa al final de la compilación de la solución. Al compilar un archivo de solución, Directory.Build.props y Directory.Build.targets no se importan, por lo que debe usar Directory.Solution.props y Directory.Solution.targets en su lugar. No se importan implícitamente entre sí.

Si tiene Directory.Solution.props o Directory.Solution.targets en una carpeta raíz, pero tiene una solución en esa carpeta que no desea importar, puede usar los archivos específicos de la solución mencionados anteriormente before.{solutionname}.sln.targets y after.{solutionname}.sln.targets establecer las propiedades $(ImportDirectorySolutionProps) y $(ImportDirectorySolutionTargets) en false. O bien, puede usar las propiedades $(DirectorySolutionPropsPath) y $(DirectorySolutionTargetsPath) especificar una ubicación diferente para esos archivos. Esto podría resultar útil si tiene varios subconjuntos de las soluciones que requieren determinados valores de propiedad o destinos comunes a los subconjuntos.