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

 2021-01-19 

How to change verbosity of the MSBuild task?

我想对从命令行调用的msbuild项目和从项目内部的MSBuild任务调用的详细程度有所不同。例如:

在my.proj内部:

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

在命令行上:

1
msbuild /v:d my.proj

现在,当MSBuild任务生成.csproj文件时,它也会以详细的详细程度进行处理。但是,我想以最小的冗长程度构建它。

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

1
2
3
4
5
<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>

或在实践中

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

,这很正常,但是后来我再也无法获得BuildInParallel开关的功能(我不认为有可能在多个项目中从命令行调用msbuild而不将它们包含在解决方案中吗?)

更新

我接受了Ludwo的选择:基本上创建了一个自定义记录器,其中包含两个ConsoleLogger作为成员。一个是在命令行中传递的详细信息,另一个是\\'minimal \\'。记录器将注册所有事件,并将它们传递给其中一个记录器,具体取决于当前是否正在构建csproj文件。输出看起来与正常情况完全一样,只是它不包含来自csproj文件的数千行。


您至少有两个选择:)

  • 创建另一个用于构建abc项目的msbuild脚本
    " BuildABC.proj "

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

    在您的父脚本中,使用Exec任务执行MSBuild并调用
    " BuildABC.proj "的详细程度

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

    您必须将BuildABC项目所需的所有父级属性明确传递给msbuild / p参数。

  • 使用自定义记录器。请参阅此操作方法。在这种情况下,您可以使用原始脚本:

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

    在您的自定义记录器中,请勿记录与以下内容相关的任何内容: e.ProjectFile == " a.csproj "之间的ProjectStarted事件与ProjectFinished事件之间的" a.csproj "项目(在使用诊断详细程度构建父项目时禁用对" a.csproj "项目的诊断日志记录)