2011-12-06 11 views
5

Estoy enfrentando un problema con MSBuild No puedo superarlo solo. Como resultado, confío en la sabiduría de la comunidad.¿Cómo hacer que MSBuild construya un objetivo personalizado especificado en csproj building sln?

La situación real que estoy teniendo problemas con

Tengo un archivo que contiene soluiton varios proyectos con dependencias a otros proyectos en la misma solución. Me gustaría añadir un destino personalizado a uno de los archivos csproj del proyecto y compilarlo desde la línea de comando. Me permitirá hacer todos los archivos binarios de salida necesarios para este proyecto para su posterior procesamiento durante la construcción del objetivo personalizado. Pero lo principal es que no puedo entender cómo hacerlo, Google tampoco ayuda.

Simplificación

Para hacer algo más simple que decidí hacer un nuevo proyecto de consola de C#, agregue un objetivo personalizado simple para el archivo del proyecto y tratar de hacer que construir. Todavía no hay éxito! Aquí lo que hice hasta ahora:

  1. Creé una aplicación de solución con una coreapp de proyecto de consola predeterminada. Esto me gaves al menos dos archivos:

    • app.sln
    • coreapp \ coreapp.csproj
  2. coreapp.csproj modificado con la adición de mi objetivo de encargo dentro de la etiqueta Proyecto

    <Target Name="SampleTarget"> 
        <Message Text="This is a SampleTarget" /> 
    </Target> 
    
  3. Ejecute en la línea de comando el siguiente comando

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp:SampleTarget

    o incluso

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp.csproj:SampleTarget

Resultados

No hubo suerte, que enfrenta el error

MSB4057: The target "coreapp.csproj:SampleTarget" does not exist in the project.

Sospecho que MSBuild piensa somehting fundamentalmente diferente de lo que yo quiero que piense ...

Además de eso, también trató de establecer en la misma línea de comandos de la variable de entorno MSBuildEmitSolution = 1 para forzar msbuild volcar una solución temporal archivo que crea al procesar la solución. En este archivo, de hecho, no hay tal objetivo. Sin embargo, supongo que no es la razón porque le pedí a msbuild que construyera coreapp.proj donde realmente reside el ObjectTarget objetivo.

La pregunta es cómo construir SampleTarget en este escenario simplificado usando el archivo de solución ya que potencialmente puede contener dependencias para el proyecto que contiene este objetivo SampleTarget?

¡Estaría agradecido por cualquier tipo de ayuda o fuego para futuras investigaciones!

+0

¿Esto ayuda? http://stackoverflow.com/questions/3397460/custom-common-target-to-build-a-solution –

Respuesta

0

Una opción es vincular su SampleTarget a los objetivos de compilación estándar mediante la anulación de la propiedad DependsOn adecuada. En este caso, podría decirle a BeforeBuild que DependsOn SampleTarget o hacer lo mismo con AfterBuild. Esto asegurará que MSBuild procese su objetivo antes del objetivo estándar indicado.

2

En lugar de insertar un objetivo personalizado en el archivo de proyecto, podría intentar crear un nuevo archivo independiente msbuild, lo que haría:

  • construir el archivo de solución (que construye proyectos)
  • define a su objetivo adicional

Llámalo app-custom-Debug.msbuild, por ejemplo.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <WorkingFolder>$(MSBuildProjectDirectory)</WorkingFolder> 
    <Configuration>Debug</Configuration> 
    <SolutionFile>app.sln</SolutionFile> 
    </PropertyGroup> 

    <Target Name="Build" DependsOnTargets="Compile" /> 

    <Target Name="Compile"> 
    <Message Text="=== COMPILING $(Configuration) configuration ===" /> 
    <MSBuild Projects="$(SolutionFile)" 
      Properties="Configuration=$(Configuration)" /> 
    </Target> 

    <Target Name="SampleTarget"> 
    <Message Text="This is a SampleTarget" /> 
    </Target> 

</Project> 

A continuación, ejecute:

msbuild.exe app-custom-Debug.msbuild /t:SampleTarget 
Cuestiones relacionadas