如何更改MSBuild任务的详细程度?

如何更改MSBuild任务的详细程度?,msbuild,verbosity,Msbuild,Verbosity,我希望对从命令行调用的msbuild项目和从项目内由msbuild任务调用的项目使用不同的详细信息。例如: 在my.proj中: <Target Name=Foo> <MSBuild Projects="a.csproj;b.csproj;c.csproj"/> </Target> 现在,当MSBuild任务构建.csproj文件时,它也会详细地进行构建。然而,我希望用最少的冗长来构建它 我知道可以像这样手动调用msbuild: <Target N

我希望对从命令行调用的msbuild项目和从项目内由msbuild任务调用的项目使用不同的详细信息。例如:

在my.proj中:

<Target Name=Foo>
  <MSBuild Projects="a.csproj;b.csproj;c.csproj"/>
</Target>
现在,当MSBuild任务构建.csproj文件时,它也会详细地进行构建。然而,我希望用最少的冗长来构建它

我知道可以像这样手动调用msbuild:

<Target Name=Foo>
  <Exec Command="msbuild /v:m a.csproj"/>
  <Exec Command="msbuild /v:m b.csproj"/>
  <Exec Command="msbuild /v:m c.csproj"/>
</Target>

还是在实践中

<Target Name=Foo>
  <Exec Command="msbuild /v:m %(Projectlist.Identity)"/>
</Target>

这很正常,但是我再也不能获得
BuildInParallel
开关的功能了(我不认为在解决方案中不包含多个项目的情况下,从命令行调用msbuild是可能的)

更新

我使用了Ludwo的选项:基本上创建一个自定义记录器,其中包含两个ConsoleLogger作为成员。一个在命令行中传递详细信息,另一个是“最小”。记录器注册所有事件,并根据当前是否正在生成csproj文件将其传递给其中一个记录器。输出看起来与正常情况完全一样,只是它不包含csproj文件中的数千行。

您有两个选项(至少):)

  • 为构建abc项目创建一个附加的msbuild脚本 “BuildABC.proj”

    
    
    在父脚本中,使用Exec任务和调用执行MSBuild “BuildABC.proj”的详细程度最低

        <Target Name=Foo>
          <Exec Command="msbuild /v:m /m:2 BuildABC.proj"/>
        </Target>
    
    
    
    必须将BuildABC项目中需要的所有父属性显式传递给msbuild/p参数

  • 使用自定义记录器。在这种情况下,您可以使用原始脚本:

    <Target Name=Foo>
      <MSBuild Projects="a.csproj;b.csproj;c.csproj"/>
    </Target>
    
    
    
    在自定义记录器中,不要在ProjectStarted和ProjectFinished事件之间记录与“a.csproj”项目相关的任何内容,其中e.ProjectFile==“a.csproj”(在使用诊断详细信息构建父项目时禁用“a.csproj”项目上的诊断记录)


  • 是的,我已经尝试过这种方法,并且调用了相同的构建脚本(例如,在parent.proj调用中
    ;这确实有效,但有一个主要缺点:除非明确地传递,否则父构建脚本中的所有属性在另一个脚本中都不可用。当有很多属性时,这将成为一个主要的PITA,而且每次添加一个属性时,必须在两个位置添加一个。谢谢!我将研究自定义的logger解决方案当我有时间的时候,它看起来确实很有希望。Scott Hanselman的这篇文章可能会启发你。+读起来很有趣。但是我的项目不包含在解决方案中,所以
    /m
    开关与有效地并行构建项目的效果不同:它们仍然是按顺序构建的(我将更新问题以反映这一点)在我们的一个项目中,我们使用了MSBuild Sidekick来确定如何构建产品层次结构,这也可能有助于任务的并行化。冗余度与并行度耦合似乎很奇怪。它并没有真正耦合,只是我试图通过调用msbuil来绕过MSBuild任务的冗余度的副作用手工制作
        <Target Name=Foo>
          <Exec Command="msbuild /v:m /m:2 BuildABC.proj"/>
        </Target>
    
    <Target Name=Foo>
      <MSBuild Projects="a.csproj;b.csproj;c.csproj"/>
    </Target>