Cómo obtener la salida de la tarea ejecutiva con msbuild

82

Estoy tratando de obtener un resultado simple por tarea ejecutiva con msbuild:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Test">
    <Exec Command="echo test output">
      <Output TaskParameter="Outputs" ItemName="Test1" />
    </Exec>
    <Exec Command="echo test output">
      <Output TaskParameter="Outputs" PropertyName="Test2" />
    </Exec>
    <Message Text="----------------------------------------"/>
    <Message Text="@(Test1)"/>
    <Message Text="----------------------------------------"/>
    <Message Text="$(Test2)"/>
    <Message Text="----------------------------------------"/>
  </Target>
</Project>

Pero obtenga el siguiente resultado:

  echo test output
  test output
  echo test output
  test output
  ----------------------------------------
  ----------------------------------------
  ----------------------------------------

¿Cómo puedo obtener la salida de mi script?

tbicr
fuente
1
posible duplicado de los resultados
Christian.K
parece ser cierto, gracias, me pierdo la información de documentación
tbicr
1
Bueno, la documentación generalmente no se trata de lo que no es posible, sino de lo que es. Dicho esto, su pregunta parece ser común, por lo que tal vez debería agregar el "contenido de la comunidad" apropiado y así mejorar la documentación de MSDN.
Christian.K
2
aparte del hack de archivos en la publicación relacionada con Gathering ..., no parece que el ejecutivo pueda hacer esto muy bien con el ejecutivo. De hecho, algunas personas piden una versión mejorada de msbuildextensions. ¿Qué está intentando hacer con el ejecutivo? Puede haber una forma más fácil de lograr lo que esté intentando. Por ejemplo, puede obtener valores de fecha y hora de la tarea MSBuild.ExtensionPack.Framework.DateAndTime. Si realmente necesita esta funcionalidad, creo que la mejor ruta a seguir sería crear una tarea msbuild personalizada. Intentaré preparar uno cuando tenga tiempo y publicarlo aquí.
Dan Csharpster
stackoverflow.com/questions/11096148/… Este enlace usa <Message Importance = "high" Text = "$ (Test2)" />
Cyrus Downey

Respuestas:

141

¡Buenas noticias para todos! Ahora puede capturar la salida <Exec>de .NET 4.5.

Me gusta esto:

<Exec ... ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
</Exec>

Simplemente:

  • Agregar ConsoleToMsBuild="true"a su <Exec>etiqueta
  • Capture la salida usando el ConsoleOutputparámetro en una <Output>etiqueta

¡Finalmente!

Documentación aquí

Cereza Avi
fuente
2
Esto funciona con MSBuild 12, que está instalado por Microsoft Build Tools 2013: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul
1
@AviCherry, ¿puede incluir el enlace a la documentación en su respuesta en lugar de en los comentarios? ¿Pudiste hacer que esto funcionara en el contexto de TFS Team Build 2012?
Ryan Gates
3
¡Gran descubrimiento, @AviCherry! Qué descuido que ConsoleToMSBuild ConsoleOutput no se encuentre en la documentación de la tarea Exec en sí ( msdn.microsoft.com/en-us/library/x8zx72cd.aspx ).
vertedero
1
Esto ahora está documentado aquí: docs.microsoft.com/en-us/visualstudio/msbuild/exec-task
Raif Atef
7

He llegado a un punto en el que estoy tan frustrado con las limitaciones de MSBuild, y las cosas que se supone que funcionan pero no funcionan (al menos no en todos los contextos), que casi siempre que necesito hacer algo con MSBuild , Creo una tarea de compilación personalizada en C #.

Si ninguna de las otras sugerencias funciona, entonces ciertamente podría hacerlo de esa manera.

Samer Adra
fuente
3
Siento tu dolor, aunque mi tarea personalizada es un script de Python.
NetworkBurger
Comprensible, pero creo que MSBuild es una forma más estructurada de canalizar información a las consolas de salida / error. Aunque definitivamente siento que está un paso por encima de los archivos por lotes
Nate-Wilkins
2
Sé que esto está muy lejos de cuando tuvo este problema, pero me pasó lo mismo y lo resolví configurando ToolsVersion = "12.0" en el elemento raíz <Project> .. espero que esto sea de ayuda :)
Paul Carroll
4

Si desea capturar la salida en una estructura similar a una matriz y no en una cadena simple donde las líneas de salida están separadas por un punto y coma, use ItemName en lugar de PropertyName :

<Exec ... ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" ItemName="OutputOfExec" />
</Exec>
Frantisek Bachan
fuente
1

Puede canalizar la salida a un archivo, por así decirlo, y volver a leerlo.

echo test output > somefile.txt
Syam
fuente