So erhalten Sie eine Exec-Task-Ausgabe mit msbuild


82

Ich versuche, eine einfache Ausgabe durch eine ausführende Aufgabe zu erhalten mit 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>

Aber nächste Ausgabe erhalten:

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

Wie kann ich von meinem Skript ausgegeben werden?



scheint wahr zu sein, danke, ich vermisse Dokumentationsinformationen
tbicr

1
Bei der Dokumentation geht es normalerweise nicht darum, was nicht möglich ist, sondern was. Trotzdem scheint Ihre Frage häufig zu sein. Vielleicht sollten Sie geeignete "Community-Inhalte" hinzufügen und so die MSDN-Dokumentation verbessern.
Christian.K

2
Abgesehen von dem Datei-Hack im Beitrag zu Gathering ... scheint es nicht so, als ob exec dies mit exec sehr gut kann. In der Tat fordern einige Leute eine verbesserte Version in msbuildextensions. Was versuchst du mit exec zu tun? Möglicherweise gibt es einen einfacheren Weg, um das zu erreichen, was Sie versuchen. Beispielsweise können Sie Datums- / Uhrzeitwerte aus der Aufgabe MSBuild.ExtensionPack.Framework.DateAndTime abrufen. Wenn Sie diese Funktionalität wirklich benötigen, ist das Erstellen einer benutzerdefinierten msbuild-Aufgabe meiner Meinung nach der beste Weg. Ich werde versuchen, einen zu zaubern, wenn ich etwas Zeit habe, und ihn hier posten.
Dan Csharpster

stackoverflow.com/questions/11096148/… Dieser Link verwendet <Message Importance = "high" Text = "$ (Test2)" />
Cyrus Downey

Antworten:


141

Gute Nachrichten, Leute! Sie können jetzt die Ausgabe ab <Exec>.NET 4.5 erfassen .

So was:

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

Einfach:

  • Fügen Sie ConsoleToMsBuild="true"Ihrem <Exec>Tag hinzu
  • Erfassen Sie die Ausgabe mit dem ConsoleOutputParameter in einem <Output>Tag

Schließlich!

Dokumentation hier



2
Dies funktioniert mit MSBuild 12, das von den Microsoft Build Tools 2013 installiert wird: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul

1
@AviCherry Können Sie bitte den Link zur Dokumentation in Ihre Antwort und nicht in die Kommentare aufnehmen? Konnten Sie dies im Kontext von TFS Team Build 2012 zum Laufen bringen?
Ryan Gates

3
Toller Fund, @AviCherry! Was für ein Versehen, dass ConsoleToMSBuild ConsoleOutput in der Dokumentation für die Exec-Task selbst fehlt ( msdn.microsoft.com/en-us/library/x8zx72cd.aspx ).
Wehr


7

Ich bin an einem Punkt angelangt, an dem ich so frustriert bin über die Einschränkungen von MSBuild und die Dinge, die funktionieren sollen, aber nicht (zumindest nicht in jedem Kontext), dass ich so ziemlich immer etwas mit MSBuild tun muss Ich erstelle eine benutzerdefinierte Build-Aufgabe in C #.

Wenn keiner der anderen Vorschläge funktioniert, können Sie dies sicherlich auch tun.


3
Ich fühle deinen Schmerz - obwohl meine benutzerdefinierte Aufgabe ein Python-Skript ist.
NetworkBurger

Verständlich, aber ich denke, MSBuild ist eher eine strukturierte Methode, um Informationen in die Ausgabe- / Fehlerkonsolen zu leiten. Obwohl ich definitiv das Gefühl habe, dass es ein Schritt über Batch-Dateien ist
Nate-Wilkins

2
Ich weiß, dass dies noch lange nicht der Fall war, als Sie dieses Problem hatten, aber ich hatte genau das Gleiche und habe es behoben, indem ich ToolsVersion = "12.0" im root-Element <Project> gesetzt habe. Ich hoffe, dies ist hilfreich :)
Paul Carroll

4

Wenn Sie die Ausgabe in einer Array-ähnlichen Struktur und nicht in einer einfachen Zeichenfolge erfassen möchten, bei der die Ausgabezeilen durch ein Semikolon getrennt sind, verwenden Sie ItemName anstelle von PropertyName :

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

1

Sie können die Ausgabe sozusagen in eine Datei leiten und zurücklesen.

echo test output > somefile.txt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.