1

我正在尝试编写一个 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 或自定义构建任务。

谁能建议我可以做到这一点的方法?

4

1 回答 1

1

您正在以错误的方式处理此问题。记录器不应该能够访问正在执行的任务。情况恰恰相反。您的任务应该使用记录器记录消息。因此,在您的情况下,您应该增强DoCompile任务(以及您创建的其他任务)以向记录器注册所有消息。因此,在 Execute 方法中只需放置一些Log.LogMessage(...)消息来记录您感兴趣的属性。

于 2010-03-14T18:02:37.040 回答