Question

I'd like to have a different verbosity for the msbuild project invoked from the commandline, and those invoked by the MSBuild task from within the project. For example:

Inside my.proj:

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

On the commandline:

msbuild /v:d my.proj

now when the MSBuild task builds the .csproj files, it does it with detailed verbosity as well. However I'd want to build it with minimal verbosity.

I know it is possible to invoke msbuild manually like so:

<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>

or in practice

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

and this works well off course, but then I cannot get the functionality of the BuildInParallel switch anymore (I do not think it is possible to invoke msbuild from the commandline with multiple projects without them being contained in a solution?)

Update

I went with Ludwo's option: basically create a custom logger that holds two ConsoleLoggers as a member. One has the verbosity passed at command line, the other one is 'minimal'. The logger registers for all events and passes them to one of the loggers depending on whether a csproj file is currently being built or not. Output looks exactly like normal, except it doesn't include thousands of lines from the csproj files.

Was it helpful?

Solution

You have two options (at least) :)

  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)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top