12

我希望从命令行调用的 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 文件的数千行。

4

1 回答 1

5

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

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

        <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. 使用自定义记录器。看看这个怎么做。在这种情况下,您可以使用原始脚本:

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

    在您的自定义记录器中,不要在 ProjectStarted 和 ProjectFinished 事件之间记录与“a.csproj”项目相关的任何内容,其中 e.ProjectFile == “a.csproj”(在构建父项目时禁用“a.csproj”项目的诊断日志记录诊断冗长)

于 2011-10-25T11:12:47.780 回答