Как изменить многословность задачи MSBuild? - PullRequest
11 голосов
/ 23 октября 2011

Я бы хотел иметь разные подробности для проекта 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.

1 Ответ

4 голосов
/ 25 октября 2011

У вас есть два варианта (как минимум) :)

  1. Создайте один дополнительный скрипт msbuild для сборки abc-проектов. "BuildABC.proj"

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

    В вашем родительском скрипте выполните MSBuild, используя задачу Exec, и вызовите "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>
    

    В вашем настраиваемом логгере не регистрируйте ничего, например, связанной Проект "a.csproj" между событиями ProjectStarted и ProjectFinished, где e.ProjectFile == "a.csproj" (чтобы отключить ведение журнала диагностики в проекте "a.csproj" при создании родительского проекта с подробным описанием диагностики)

...