【问题标题】:How to change verbosity of the MSBuild task?如何更改 MSBuild 任务的详细程度?
【发布时间】:2011-12-13 12:27:33
【问题描述】:

我想为从命令行调用的 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 作为成员。一个具有在命令行传递的详细程度,另一个是“最小”。记录器注册所有事件并将它们传递给其中一个记录器,具体取决于当前是否正在构建 csproj 文件。输出看起来和正常一样,只是它不包含来自 csproj 文件的数千行。

【问题讨论】:

  • Scott Hanselman 的这篇文章可能会启发你。 hanselman.com/blog/…
  • + 有趣的阅读。但是我的项目不包含在解决方案中,因此/m 开关与有效地并行构建项目的效果不同:它们仍然是按顺序构建的(我将更新问题以反映这一点)
  • 在我们的一个项目中,我们使用 MSBuild Sidekick 来弄清楚如何构建我们的产品层次结构,也许值得一看以协助任务的并行化。 attrice.info/msbuild 冗长与并行性耦合似乎很奇怪。
  • 这并不是真正的耦合,这只是我试图通过手动调用 msbuild 来绕过 MSBuild 任务的冗长的副作用

标签: msbuild verbosity


【解决方案1】:

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

  1. 创建一个额外的 msbuild 脚本来构建 abc 项目 "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”项目的诊断日志记录)

【讨论】:

  • 是的,我已经尝试过这种方法,以及回调到相同的构建脚本(例如在 parent.proj 中调用&lt;Exec Command="msbuild /v:m /m:2 /t:BuildSomething parent.proj"/&gt;;这确实有效,但有一个主要缺点:除非明确传递,否则父构建脚本中的所有属性在另一个中不可用。当有很多属性时,它成为主要的 PITA,而且每次添加一个时,您必须在两个地方添加。
  • 谢谢!有时间我会研究自定义记录器解决方案,它看起来很有希望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 2022-08-23
  • 1970-01-01
相关资源
最近更新 更多