Чтение атрибутов пользовательских задач MSBuild через события в Logger - PullRequest
1 голос
/ 14 марта 2010

Я пытаюсь написать модуль регистрации MSBuild, который регистрирует информацию при получении TaskStarted событий о Задаче и ее параметрах.

Сборка запускается командой:

MSBuild.exe /logger:MyLogger.dll build.xml

Внутри build.xml находится последовательность задач, большинство из которых были написаны на заказ для компиляции решения (C ++ или C #) и доступны с помощью следующей настраиваемой задачи:

<DoCompile Desc="Building MyProject 1" Param1="$(Param1Value)" /> 
<DoCompile Desc="Building MyProject 2" Param1="$(Param1Value)" /> <!-- etc -->

Пользовательская задача сборки DoCompile определяется как:

public class DoCompile : Microsoft.Build.Utilities.Task
{
    [Required]
    public string Description { set { _description = value; } }

    // ... more code here ...
}

Пока выполняется сборка, при запуске каждой задачи модуль регистратора получает IEventSource.TaskStarted события, подписанные на следующее:

public class MyLogger : Microsoft.Build.Utilities.Logger
{
    public override void Initialize(Microsoft.Build.Framework.IEventSource eventSource)
    {
        eventSource.TaskStarted += taskStarted;
    }

    private void taskStarted(object sender, Microsoft.Build.Framework.TaskStartedEventArgs e)
    {
        // write e.TaskName, attributes and e.Timestamp to log file
    }
}

Проблема, с которой я столкнулся, заключается в том, что в приведенном выше методе taskStarted() я хочу получить доступ к атрибутам задачи, для которой было сгенерировано событие. У меня есть доступ только к коду журнала и я не могу изменить ни build.xml, ни пользовательские задачи сборки.

Кто-нибудь может подсказать, как я могу это сделать?

1 Ответ

1 голос
/ 14 марта 2010

Вы подходите к этому неправильно. Регистраторы не должны быть в состоянии достичь задач, которые выполняются. Это наоборот. Ваши задачи должны регистрировать сообщения с помощью регистратора. Таким образом, в вашем случае вам нужно улучшить задачу DoCompile ( и другие созданные вами задачи ), чтобы зарегистрировать все сообщения в логгере. Так что внутри метода Execute просто поместите несколько Log.LogMessage(...) сообщений для регистрации интересующих вас свойств.

...