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?
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 ? –