Jak uzyskać dane wyjściowe zadania za pomocą programu msbuild

83

Próbuję uzyskać proste dane wyjściowe przez wykonanie zadania z 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>

Ale pobierz następny wynik:

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

Jak mogę uzyskać dane wyjściowe mojego skryptu?

tbicr
źródło
1
możliwy duplikat danych wyjściowych Gathering z zadania wykonania programu MSBuild
Christian.K
wydaje się być prawdą, dzięki, brakuje mi informacji z dokumentacji
tbicr
1
Cóż, dokumentacja zazwyczaj nie dotyczy tego, co nie jest możliwe, ale co jest. Mając to na uwadze, Twoje pytanie wydaje się być powszechne, więc może powinieneś dodać odpowiednią „zawartość społeczności”, a tym samym ulepszyć dokumentację MSDN.
Christian.K
2
pomijając hackowanie plików w poście związanym z Gathering ..., nie wydaje się, żeby exec mógł to zrobić dobrze z exec. W rzeczywistości niektórzy ludzie proszą o ulepszoną wersję w msbuildextensions. Co próbujesz zrobić z exec? Może istnieć łatwiejszy sposób na osiągnięcie tego, co próbujesz. Na przykład można pobrać wartości daty i godziny z zadania MSBuild.ExtensionPack.Framework.DateAndTime. Jeśli naprawdę potrzebujesz tej funkcji, myślę, że najlepszym rozwiązaniem byłoby zbudowanie niestandardowego zadania msbuild. Postaram się podnieść jedną, kiedy będę miała trochę czasu i opublikować ją tutaj.
Dan Csharpster,
stackoverflow.com/questions/11096148/… To łącze używa <Message Importance = "high" Text = "$ (Test2)" />
Cyrus Downey

Odpowiedzi:

142

Dobre wieści wszyscy! Możesz teraz przechwytywać dane wyjściowe z <Exec>.NET 4.5.

Lubię to:

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

Po prostu:

  • Dodaj ConsoleToMsBuild="true"do swojego <Exec>tagu
  • Przechwyć dane wyjściowe za pomocą ConsoleOutputparametru w <Output>tagu

Wreszcie!

Dokumentacja tutaj

Avi Cherry
źródło
2
Ups, tak. Jest pod adresem: msdn.microsoft.com/en-us/library/ms124731(v=VS.110).aspx
Avi Cherry
2
Działa to z programem MSBuild 12, który jest instalowany przez Microsoft Build Tools 2013: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul
1
@AviCherry czy możesz zamieścić link do dokumentacji w swojej odpowiedzi zamiast w komentarzach? Czy udało Ci się to zadziałać w kontekście TFS Team Build 2012?
Ryan Gates
3
Świetne znalezisko, @AviCherry! Co za przeoczenie, że ConsoleToMSBuild ConsoleOutput brakuje w dokumentacji samego zadania Exec ( msdn.microsoft.com/en-us/library/x8zx72cd.aspx ).
jaz
1
Jest to teraz udokumentowane tutaj: docs.microsoft.com/en-us/visualstudio/msbuild/exec-task
Raif Atef
7

Doszedłem do punktu, w którym jestem tak sfrustrowany ograniczeniami MSBuild i rzeczy, które powinny działać, ale nie (przynajmniej nie w każdym kontekście), że prawie zawsze muszę zrobić cokolwiek z MSBuild , Tworzę niestandardowe zadanie kompilacji w C #.

Jeśli żadna z pozostałych sugestii nie działa, z pewnością możesz to zrobić w ten sposób.

Samer Adra
źródło
3
Czuję twój ból - chociaż moje niestandardowe zadanie to skrypt w Pythonie.
NetworkBurger,
Zrozumiałe, ale myślę, że MSBuild jest bardziej ustrukturyzowanym sposobem przesyłania informacji do konsol wyjścia / błędów. Chociaż zdecydowanie uważam, że jest to krok powyżej plików wsadowych
Nate-Wilkins
2
Wiem, że to już koniec drogi od czasu, gdy miałeś ten problem, ale właśnie wydarzyło się to samo i rozwiązałem go, ustawiając ToolsVersion = "12.0" w elemencie root <Project> .. mam nadzieję, że to pomoże :)
Paul Carroll
4

Jeśli chcesz przechwycić dane wyjściowe do struktury przypominającej tablicę, a nie do zwykłego ciągu, w którym wiersze wyjściowe są oddzielone średnikiem, użyj ItemName zamiast PropertyName :

<Exec ... ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" ItemName="OutputOfExec" />
</Exec>
Frantisek Bachan
źródło
1

Możesz potokować wyjście do pliku, że tak powiem, i odczytać go z powrotem.

echo test output > somefile.txt
Syam
źródło