2010-03-14 2 views
1

J'essaie d'écrire un module de consignation MSBuild qui consigne des informations lors de la réception des événements TaskStarted concernant la tâche et ses paramètres.Lecture des attributs des tâches personnalisées MSBuild via des événements dans le consignateur

La construction est exécutée avec la commande:

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

Dans le build.xml est une séquence de tâches, dont la plupart ont été écrites sur mesure pour compiler une solution (C++ ou C#), et sont accessibles avec la tâche personnalisée suivante:

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

la tâche de construction personnalisée DoCompile est définie comme:

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

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

Alors que la construction est en cours d'exécution, chaque tâche démarre, le module enregistreur reçoit IEventSource.TaskStarted événements, souscrites comme suit:

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 
    } 
} 

Le problème que j'ai est que dans la méthode taskStarted() ci-dessus, je veux être en mesure de accéder aux attributs de la tâche pour laquelle l'événement a été déclenché. J'ai seulement accès au code de l'enregistreur et ne peux pas modifier le build.xml ou les tâches de construction personnalisées.

Quelqu'un peut-il suggérer un moyen de le faire?

Répondre

1

Vous vous approchez de la mauvaise façon. Les enregistreurs ne devraient pas pouvoir atteindre les tâches en cours d'exécution. C'est l'inverse. Vos tâches doivent consigner les messages avec l'enregistreur. Donc, dans votre cas, vous devriez améliorer la tâche DoCompile (et d'autres tâches que vous avez créées) pour enregistrer tous les messages avec l'enregistreur. Donc, à l'intérieur de la méthode Execute juste mettre quelques messages Log.LogMessage(...) pour enregistrer les propriétés qui vous intéressent.

+0

Merci, mais malheureusement, je suis incapable de changer le code pour les tâches personnalisées pour diverses raisons. Je ne veux pas vraiment entrer dans la tâche, il suffit de trouver les paramètres qui lui ont été transmis (de la même manière que je peux trouver son nom). Même l'obtention d'une référence d'objet d'une tâche suffirait pour pouvoir ensuite utiliser la réflexion, bien que ce ne soit qu'un hack. J'ai plusieurs appels 'Log.LogMessage()' à partir des tâches mais aucun n'est aussi cohérent que le paramètre transmis. 'LogMessage()' est assez vague aussi - peut-être que l'écoute d'un événement personnalisé peut être meilleure ? –

Questions connexes