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

14

我希望在通过命令行调用的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的选项:基本上创建一个自定义记录器,该记录器拥有两个ConsoleLoggers作为成员。一个传递了命令行传递的详细程度,另一个则是“最小”级别。记录器注册所有事件,并根据当前是否正在构建csproj文件将它们传递给其中一个记录器。输出看起来与正常情况完全相同,只是不包括来自csproj文件的数千行内容。


这篇Scott Hanselman的文章可能会让你受益匪浅。 http://www.hanselman.com/blog/FasterBuildsWithMSBuildUsingParallelBuildsAndMulticoreCPUs.aspx - Carlo Kuip
有趣的阅读。然而,我的项目并不包含在解决方案中,因此 /m 开关没有与并行构建项目具有相同的效果:它们仍然是按顺序构建的(我将更新问题以反映这一点)。 - stijn
在我们的一个项目中,我们使用了MSBuild Sidekick来确定如何构建我们的产品层次结构,这可能值得一看,以协助任务的并行化。http://www.attrice.info/msbuild/ 看起来奇怪的是,冗长性与并行性相耦合。 - Carlo Kuip
这并不是真正的耦合,而只是我试图通过手动调用msbuild来避免MSBuild任务冗长的副作用。 - stijn
1个回答

5

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

  1. Create one additional msbuild script for building abc projects "BuildABC.proj"

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

    In your parent script execute MSBuild using Exec task and call "BuildABC.proj" with minimal verbosity

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

    You have to pass explicitly all parent properties needed in the BuildABC project to msbuild /p parameter.

  2. Use custom logger. See this how to do it. In this case you can use your original script:

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

    In your custom logger do not log anything related to e.g. "a.csproj" project between ProjectStarted and ProjectFinished events where e.ProjectFile == "a.csproj" (to disable diagnostic logging on "a.csproj" project while building parent project with diagnostic verbosity)


是的,我已经尝试过这种方法,以及回调到相同的构建脚本(例如在parent.proj中调用<Exec Command="msbuild /v:m /m:2 /t:BuildSomething parent.proj"/>;这确实可以工作,但有一个主要缺点:除非显式传递,否则来自父构建脚本的所有属性在其他构建脚本中都不可用。当有很多属性时,这将成为一个主要的烦恼,而且每次添加一个属性时,您都必须在两个地方添加它。 - stijn
谢谢!我会在有时间的时候研究一下自定义日志记录器解决方案,它看起来很有前途。 - stijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接