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

时间:2011-10-23 10:43:48

标签: msbuild verbosity

我想对从命令行调用的msbuild项目以及项目中的MSBuild任务调用的项目有不同的详细程度。例如:

在my.proj中:

<Target Name=Foo>
  <MSBuild Projects="a.csproj;b.csproj;c.csproj"/>
</Target>

在命令行上:

msbuild /v:d my.proj

现在,当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作为成员保存。一个是在命令行传递的冗长,另一个是'minimal'。记录器注册所有事件并将其传递给其中一个记录器,具体取决于当前是否正在构建csproj文件。输出看起来与正常情况完全相同,只是它不包含csproj文件中的数千行。

1 个答案:

答案 0 :(得分:4)

你有两个选择(至少):)

  1. 为构建abc项目创建一个额外的msbuild脚本 “BuildABC.proj”

        <Target Name="BuildABC">
          <MSBuild Projects="a.csproj;b.csproj;c.csproj" BuildInParallel="true"/>
        </Target>
    

    在您的父脚本中使用Exec任务执行MSBuild并调用 具有最小详细程度的“BuildABC.proj”

        <Target Name=Foo>
          <Exec Command="msbuild /v:m /m:2 BuildABC.proj"/>
        </Target>
    

    您必须将BuildABC项目中所需的所有父属性显式传递给msbuild / p参数。

  2. 使用自定义记录器。 See this how to do it。在这种情况下,您可以使用原始脚本:

    <Target Name=Foo>
      <MSBuild Projects="a.csproj;b.csproj;c.csproj"/>
    </Target>
    

    在您的自定义记录器中,请勿记录与例如在ProjectStarted和ProjectFinished事件之间的“a.csproj”项目,其中e.ProjectFile ==“a.csproj”(在构建具有诊断详细程度的父项目时禁用“a.csproj”项目的诊断日志记录)