una trabajo redacta proyecto objetivos objetivo investigacion generales general especificos empresa como msbuild msbuild-wpp

msbuild - trabajo - objetivos generales y especificos de una empresa



MSBuild: los objetivos específicos del proyecto para la solución no funcionan (2)

Tengo una solución que tiene varios proyectos, incluida una aplicación web. Quiero que MSBuild ejecute el objetivo "WebPublish" contra el proyecto de la aplicación web y el "objetivo predeterminado" para todos los demás proyectos en la solución.

Este artículo de MSDN dice que puedo hacerlo especificando la línea de comandos

msbuild SlnFolders.sln /t:NotInSlnfolder:Rebuild;NewFolder/InSolutionFolder:Clean

Pero nunca pude hacerlo funcionar - MSBuild devuelve un error, algo así como el objetivo "NotInSlnFolder: Reconstruir" no existe. No importa qué objetivo especificar, Construir, Reconstruir o Limpiar, no funciona en ningún caso.

¿Cómo puedo lograr mi objetivo de especificar objetivos específicos del proyecto para una solución?

La documentación de MSDN no funciona. ¿O me he perdido algo?


Puede abrir su archivo de solución en el editor de texto y verificar si existe la siguiente línea o no, si no, entonces puede agregar

<Import Project="$(MSBuildToolsPath)/Microsoft.CSharp.targets" /> dentro de la etiqueta <Project> .

Espero que esto te ayude.


NOTA: esta solución no es oficialmente compatible con Microsoft, por lo que no hay garantía de que funcionará para siempre.

Respuesta corta

En la carpeta con el archivo SLN, cree el archivo before.{YourSolution}.sln.targets , con el siguiente contenido: (Reemplace lo que esté entre paréntesis a lo que necesite).

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="{MyCompany_MyProduct_WebApp:WebPublish}"> <MSBuild Condition="''%(ProjectReference.Identity)'' == ''{$(SolutionDir)MyCompany.MyProduct.WebApp/MyCompany.MyProduct.WebApp.csproj}''" Projects="@(ProjectReference)" Targets="{WebPublish}" BuildInParallel="True" ToolsVersion="4.0" Properties="BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" SkipNonexistentProjects="%(ProjectReference.SkipNonexistentProjects)" /> </Target> </Project>

Después de eso puedes ejecutar la línea de comando:

msbuild {YourSolution}.sln /t:{MyCompany_MyProduct_WebApp:WebPublish}

Respuesta larga

Si agrega la variable de entorno MSBUILDEMITSOLUTION , estableciendo su valor en 1, MSBuild no eliminará los archivos temporales generados para la solución y los proyectos.

Esto le permitirá encontrar los {YourSolution}.sln.metaproj y {YourSolution}.sln.metaproj.tmp generados en la carpeta de la solución, que son solo archivos de proyecto estándar de MSBuild.

Para MSBuild 3.5 , el archivo generado es {YourSolution}.sln.cache y se conserva independientemente de las variables de entorno. Al analizar esos archivos, comprenderá los detalles de bajo nivel del proceso y verá las oportunidades de personalización disponibles.

Después de ejecutar MSBuild con un objetivo específico del proyecto en el archivo .Metaproj, descubrirá que la lista de objetivos específicos del proyecto está codificada y solo se admiten los objetivos estándar (compilación, reconstrucción, limpieza, compilación, publicación; nota: publicación y publicación en web no son lo mismo). MSBuild 3.5 solo genera objetivos Limpiar, Reconstruir y Publicar, así como un objetivo con solo el nombre del proyecto que significa "Crear".

También puede ver que NotInSlnfolder:Rebuild es solo un nombre de un objetivo NotInSlnfolder:Rebuild . En realidad, MSBuild no lo analiza y no le importan los nombres y la ubicación del proyecto. También tenga en cuenta que los nombres de destino SolFolder/SolSubfolder/ProjectName:Publish especifican el nombre del proyecto con la jerarquía de carpetas de la solución si está en uno, por ejemplo, SolFolder/SolSubfolder/ProjectName:Publish .

Encontrará otra cosa de importancia crítica: el nombre de destino de MSBuild no admite puntos . Todos los puntos en los nombres de proyectos se reemplazan con guiones bajos . Por ejemplo, para un proyecto llamado MyCompany.MyProduct.Components deberá especificar en la línea de comando:

/t:MyCompany_MyProduct_Components:Rebuild

Es por eso que incluso la compilación objetivo específica del proyecto no funcionó: el nombre de mi proyecto contenía puntos .

Analizando el archivo {YourSolution}.sln.metaproj.tmp , descubrirá que en tiempo de ejecución intenta importar objetivos desde el archivo nombrado before.{YourSolution}.sln.targets y after.{YourSolution}.sln.targets , si esos archivos existe. Esto tiene una clave para la solución para esta limitación / error de MSBuild.