2010-03-14 1 views
1

작업 및 해당 매개 변수에 대한 TaskStarted 이벤트를 수신하면 정보를 기록하는 MSBuild 로거 모듈을 작성하려고합니다.로거의 이벤트를 통해 MSBuild 사용자 지정 작업 속성 읽기

빌드는 명령을 실행 :

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

build.xml 파일 내에서 사용자 정의 A (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 ... 
} 
빌드 하다니3210

각 작업을 시작으로, 로거 모듈은 다음과 같이 가입 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

잘못된 방식으로 접근 중입니다. 로거는 실행중인 작업에 접근 할 수 없어야합니다. 그것은 다른 방향입니다. 작업은 로거와 함께 메시지를 로깅해야합니다. 따라서 귀하의 경우에는 DoCompile 작업 (및 작성한 다른 작업)을 향상시켜 모든 메시지를 로거에 등록해야합니다. 그래서 Execute 메서드의 내부에 관심있는 속성을 기록하기 위해 어떤 메시지를 넣으려면 Log.LogMessage(...) 메시지를 넣으십시오.

+0

감사합니다. 그러나 유감 스럽지만 여러 가지 이유로 사용자 지정 작업의 코드를 변경할 수 없습니다. 필자는 작업에 '도달'하고 싶지 않고 매개 변수가 전달되었는지 찾아 봅니다 (이름을 찾을 수있는 것과 같은 방식으로). 심지어 작업의 객체 참조를 얻는 것만으로도 반사를 사용할 수 있습니다. 다만 해킹 일 수 있습니다. 작업에서 여러 가지'Log.LogMessage()'호출이 있지만 전달되는 매개 변수만큼 일관성이 없습니다. LogMessage()도 매우 모호합니다 - 일반적으로 사용자 정의 이벤트를 청취하는 것이 일반적인 경우보다 좋을 수 있습니다 ? –