2010-05-05 4 views
9

У меня есть программа, которая выводит файл. Я запускаю его из проекта MSBuild. Я хочу, чтобы этот вывод был написан в StdOut, так что его можно было бы получить нашим агентом сборки (TeamCity).Получите MSBuild для вывода файла в журнал?

Как мне заставить MSBuild выгружать содержимое файла на выходе?

ответ

12

Команда dos type было возможно.

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

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

главного здесь (который я не знаю), что Exec всегда (?) Использует CMD.EXE, что означает, что встроенные команды (такие как 'type') и перенаправление внутри' '. –

0

Вы должны иметь возможность сделать что-то подобное в своем скрипте сборки (обратите внимание, что я использую команду cat, которая поставляется с cygwin здесь для вывода содержимого файла). Вы можете изменить цель к тому, что подходит в зависимости от того, когда вы хотите, чтобы элемент для запуска в процессе сборки:

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

Если вам нужно установить Cygwin на сервере, вы можете получить его here. Я не знаю команды native dos, чтобы отображать содержимое эха, но может быть и одно.

+0

использование окно «тип» для Linux «кошек» –

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 не сохраняет пробел (и, возможно, даже отставание).

Вот результат, когда я выполняю цель Demo.

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). 
Смежные вопросы