获取MSBuild将文件输出到日志?

时间:2010-05-05 12:23:04

标签: msbuild

我有一个输出到文件的程序。我正在从MSBuild项目运行它。我希望将此输出写入StdOut,以便我们的构建代理(TeamCity)可以选择它。

如何让MSBuild将文件内容转储到输出?

3 个答案:

答案 0 :(得分:12)

dos命令 type 就可以了。

<Target Name="ExecProgramAndOutputToStdOut">
  <Exec Command="YourProgram.exe"/>

  <Exec Command="type output_file"/>
</Target>

答案 1 :(得分:5)

如果您知道写入文件的位置,可以使用ReadLinesFromFile任务,然后记录所有消息。例如,看一下下面的项目文件。

<Project DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <_File>$(MSBuildProjectFullPath)</_File>
    </PropertyGroup>
    <Target Name="Demo">
        <ReadLinesFromFile File="$(_File)">
            <Output ItemName="_FileContents" TaskParameter="Lines"/>
        </ReadLinesFromFile>

        <Message Text="File contents: '$(MSBuildProjectFullPath)'"/>
        <!-- Prints one after another with a ';' between each line -->
        <Message Text="@(_FileContents)"/>

        <Message Text="-------------"/>
        <!-- Prints one after another with each on its own line -->
        <Message Text="%(_FileContents.Identity)"/>
    </Target>
</Project>

此文件读取当前文件(通过$(MSBuildProjectFullPath))并将结果打印到控制台。我已经展示了如何以两种方式打印出来,一个显示了;分开的值,另一个在它自己的一行上显示一个。请注意,ReadLinesFromFile任务不会保留前导(甚至可能是尾随)空格。

这是我执行演示目标时的结果。

C:\Data\Development\My Code\Community\MSBuild>msbuild ReadLines.proj /nologo
Build started 5/6/2010 6:29:43 PM.
Project "C:\Data\Development\My Code\Community\MSBuild\ReadLines.proj" on node 1 (default targets).
Demo:
  File contents: 'C:\Data\Development\My Code\Community\MSBuild\ReadLines.proj'
  <Project DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">;<PropertyGroup>;<_Fi
  le>$(MSBuildProjectFullPath)</_File>;</PropertyGroup>;<Target Name="Demo">;<ReadLinesFromFile File="$(_File)">;<
  Output ItemName="_FileContents" TaskParameter="Lines"/>;</ReadLinesFromFile>;<Message Text="File contents: '$(MS
  BuildProjectFullPath)'"/>;<!-- Prints one after another with a ';' between each line -->;<Message Text="@(_FileC
  ontents)"/>;<Message Text="-------------"/>;<!-- Prints one after another with each on its own line -->;<Message
   Text="%(_FileContents.Identity)"/>;</Target>;</Project>
  -------------
  <Project DefaultTargets="Demo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
  <_File>$(MSBuildProjectFullPath)</_File>
  </PropertyGroup>
  <Target Name="Demo">
  <ReadLinesFromFile File="$(_File)">
  <Output ItemName="_FileContents" TaskParameter="Lines"/>
  </ReadLinesFromFile>
  <Message Text="File contents: '$(MSBuildProjectFullPath)'"/>
  <!-- Prints one after another with a ';' between each line -->
  <Message Text="@(_FileContents)"/>
  <Message Text="-------------"/>
  <!-- Prints one after another with each on its own line -->
  <Message Text="%(_FileContents.Identity)"/>
  </Target>
  </Project>
Done Building Project "C:\Data\Development\My Code\Community\MSBuild\ReadLines.proj" (default targets).

答案 2 :(得分:0)

你应该能够在你的构建脚本中做这样的事情(注意我在这里使用cygwin附带的cat命令来输出文件内容)。您可以根据您希望项目在构建过程中运行的时间将目标更改为适当的目标:

<Target Name="AfterGet">
    <Exec Command="cat your_file" />
</Target>

如果您需要在服务器上安装cygwin,可以获取它here。我不知道回显文件内容的本机dos命令,但可能有一个。