2010-05-05 3 views
9

J'ai un programme qui génère un fichier. Je l'exécute à partir d'un projet MSBuild. Je voudrais que cette sortie soit écrite dans StdOut, afin qu'elle puisse être récupérée par notre agent de construction (TeamCity).Get MSBuild pour sortir un fichier dans le journal?

Comment puis-je obtenir MSBuild pour vider le contenu d'un fichier à la sortie?

Répondre

12

La commande DOS type pouvait pour cela.

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

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

La chose importante ici (que je ne savais pas) est que Exec toujours (?) Utilise cmd.exe, ce qui signifie que les commandes intégrées (par exemple, comme 'type') et la redirection fonctionne' '. –

0

Vous devriez être capable de faire quelque chose comme ça dans votre script de construction (notez que j'utilise ici la commande cat fournie avec cygwin pour afficher le contenu du fichier). Vous pouvez changer la cible à tout ce qui est approprié en fonction lorsque vous voulez que l'élément exécuté dans votre processus de construction:

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

Si vous devez installer Cygwin sur votre serveur, vous pouvez l'obtenir here. Je ne connais pas de commande DOS native pour faire écho au contenu d'un fichier, mais il peut y en avoir une.

+0

utilisation de fenêtres de type 'pour linux « cat » –

5

Si vous savez où le fichier est qui a été écrit pour vous pouvez utiliser la tâche ReadLinesFromFile puis connectez-vous tous les messages. Par exemple, jetez un oeil au fichier de projet ci-dessous.

<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> 

Ce fichier lit le fichier en cours (via $(MSBuildProjectFullPath)) et imprime les résultats à la console. J'ai montré comment l'imprimer de 2 manières, une montre le; les valeurs séparées et l'autre en montre une sur une ligne qui lui est propre. Notez que la tâche ReadLinesFromFile ne conserve pas d'espace blanc principal (et peut-être même à la fin).

Voici le résultat lorsque j'exécute la cible de démonstration.

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). 
Questions connexes