如何在Visual Studio中实时查看MsBuild输出

时间:2019-03-13 13:09:29

标签: visual-studio msbuild

我在.csproj文件中添加了一些其他目标,以便在项目构建完成后执行一些其他任务。

在完成所有目标之前,Visual Studio输出窗口中不会显示任何内容。我希望能够看到在处理目标时发生的消息。

如果我使用MSBuild Task Explorer(一个VS扩展),可以看到消息可以在生成时由Visual Studio窗口拾取,所以我只是在某个地方缺少设置了吗?

我还尝试用MSBuild Extensions软件包中的Exec替换SmartExec任务。

这是我的.csproj项目文件中的摘录:

<Target Name="PostBuildActions" AfterTargets="Build">
<!--Get the version number from the assembly info -->
<GetAssemblyIdentity AssemblyFiles="$(ProjectDir)$(OutputPath)$(TargetFileName)">
  <Output TaskParameter="Assemblies" ItemName="ToolboxVersion" />
</GetAssemblyIdentity>
<CreateProperty Value="$(ProjectDir)$(OutputPath.TrimEnd('\'))">
  <Output TaskParameter="Value" PropertyName="ToolboxTarget" />
</CreateProperty>
<!-- Run the Simulink Widget Generator tool -->
<CreateProperty Value="&quot;$(SolutionDir)SimulinkWidgetGenerator\bin\$(Configuration)\SimulinkWidgetGenerator.exe&quot; -v %(ToolboxVersion.Version) -d &quot;$(ToolboxTarget)&quot;">
  <Output TaskParameter="Value" PropertyName="WidgetGenCommand" />
</CreateProperty>
<Message Text="Running Simulink Widget Generator:" Importance="High" />
<Message Text="$(WidgetGenCommand)" Importance="High" />
<Exec Command="$(WidgetGenCommand)" ConsoleToMSBuild="true" />
<!-- Invoke Matlab -->
<CreateProperty Value="try, PackageToolbox, catch ex, disp(getReport(ex)), exit(-1), end, exit(0);">
  <Output TaskParameter="Value" PropertyName="MatlabScript" />
</CreateProperty>
<CreateProperty Value="&quot;$(MATLAB_INSTALL_DIR)\bin\matlab.exe&quot; -automation -wait -log -sd &quot;$(ToolboxTarget)&quot; -r &quot;$(MatlabScript)&quot;">
  <Output TaskParameter="Value" PropertyName="MatlabCommand" />
</CreateProperty>
<Message Text="Invoking Matlab: " Importance="High" />
<Message Text="$(MatlabCommand)" Importance="High" />
<Exec Command="$(MatlabCommand)" ConsoleToMSBuild="true" />

3 个答案:

答案 0 :(得分:1)

实时查看MSBuild输出的关键是使用MSBuild project SDK。非常感谢Rainersigwald发布了this solution on GitHub

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RootNamespace>_5451</RootNamespace>
  </PropertyGroup>

  <Target Name="LogStuffInRealTime" BeforeTargets="CoreCompile">
    <Exec Command="ping 127.0.0.1" YieldDuringToolExecution="True" ConsoleToMSBuild="true" StandardOutputImportance="high">
      <Output TaskParameter="ConsoleOutput" ItemName="OutputOfExec" />
    </Exec> 
  </Target>
</Project>

答案 1 :(得分:0)

Visual Studio 中,您可以在工具–>选项–>项目和解决方案–>生成并运行中配置MSBuild详细程度。

MSBuild project build output verbosity

来自here

  

详细度设置为安静 –显示成功或构建失败。下面显示1行,表示编译成功。

     

详细度设置为最小 –显示构建的命令行。显示2行以成功重建。

     

详细度设置为普通。显示MSBuild目标的输出。显示25行以成功重建。

     

详细度设置为详细。 MSBuild显示了更多注释。显示395行以成功构建。

     

最后,Verbosity设置为 Diagnostic ,向您显示所有内容。显示1097行以成功构建。

答案 2 :(得分:0)

  

对于此问题,我建议您使用msbuild之类的msbuild命令   xxx.csproj通过开发人员命令提示符查看正在处理的目标。

enter image description here

  
    

那么我只是在某个地方缺少设置吗?

  

不,确实您是对的,目前,Visual Studio中的输出似乎不支持我测试后的实时显示。

  

描述这种情况的详细信息:

我们知道,有两种方法可以构建vs项目: 1.在Visual Studio中构建2. Msbuild.exe。

VS(#1)中的构建过程实际上调用Msbuild工具(#2)来工作。

Msbuild工具会将目标实时显示在控制台窗口中。

在VS中,其构建的输出似乎是非实时的  日志,该日志将在构建过程结束后显示。如果我们添加了像您这样的耗时操作,则该命令将在命令结束之前显示。 我已经为此进行了测试,创建了一个简单的test.csproj,并添加了如下脚本:

 <Target Name="WaitingToDoSth" AfterTargets="Test1">
    <Exec Command="$(ProjectDir)DoSth.exe"/>
  </Target>

此DoSth.exe中包含一个Thread.sleep(3000)。在VS中,在DoSth.exe成功执行并且整个构建过程结束之前,输出不会显示任何内容。 在VS2017的开发人员命令提示符中使用msbuild xxx.csproj命令时,显示可以是实时的,我们可以看到在处理目标时发生的消息。

如果我的回答有帮助,请提供反馈。谢谢。