通过Logger中的事件读取MSBuild自定义任务的属性

时间:2010-03-14 16:43:42

标签: logging msbuild msbuild-task

我正在尝试编写一个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 个答案:

答案 0 :(得分:1)

你正在以错误的方式接近这一点。记录器不应该能够进入正在执行的任务。这是相反的方式。您的任务应使用记录器记录消息。因此,在您的情况下,您应该增强DoCompile任务(和您创建的其他任务)以使用记录器注册所有消息。因此,在Execute方法内部只需添加一些Log.LogMessage(...)消息来记录您感兴趣的属性。