2010-06-03 7 views
3

J'essaie de générer la variable d'une cible dans la cible parente qui l'a démarrée. Par exemple,Problème lors de la sortie des variables MSBuild

La cible 1 appelle simplement la tâche dans le fichier 2 et est supposée être capable d'utiliser la variable définie dans celle-ci. Cependant, je n'arrive tout simplement pas à le faire fonctionner (mauvaise syntaxe peut-être?). Cible 1 ressemble à ceci:

<Target Name="RetrieveParameter"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="ObtainOutput" /> 
    <Message Text="Output = $(OutputVar)" /> 
</Target> 

Target 2 est où il lit la valeur du fichier texte et il met à la propriété et définit la variable « OutputVar » pour correspondre. Ceci est supposé être retourné au parent. Je suis assez nouveau pour les tâches MSBuild, donc cela pourrait bien être quelque chose d'évident. Tout ce que je veux faire est de définir une variable dans une tâche, puis l'avoir dans la tâche parente qui l'a appelée.

Répondre

4

Vous devez utiliser TargetOutputs de la tâche MSBuild:

<Target Name="RetrieveParameter"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="ObtainOutput"> 
    <Output TaskParameter="TargetOutputs" ItemName="OutputVar"/> 
    </MSBuild> 
    <Message Text="Output = @(OutputVar)" /> 
</Target> 

(Plus d'info sur MSBuild task).

5

Julien vous a donné la bonne réponse mais pas expliqué pourquoi c'est correct.

Comme vous êtes nouveau dans les tâches msbuild, j'expliquerai pourquoi la réponse de Julien est correcte.

Toutes les tâches dans msbuild ont des paramètres - vous les connaîtrez comme les attributs que vous avez mis dans la tâche. N'importe lequel de ces paramètres peut être relu en y plaçant un élément Output. L'élément de sortie a 3 attributs qui peuvent être utilisés

  • TaskParameter - c'est le nom de l'attribut/paramètre sur la tâche que vous voulez obtenir
  • ItemName - c'est la ItemGroup de mettre cette valeur de paramètre dans
  • NomPropriété - c'est le nom de la propriété de mettre cette valeur de paramètre dans

Sur vos scripts originaux, vous invoquez l'un de l'autre. Le second script s'exécutera dans un contexte différent de sorte que toute propriété ou groupe d'items qu'il définit n'existe que dans ce contexte. Par conséquent, lorsque le deuxième script est terminé, à moins que vous n'ayez spécifié certains éléments de sortie pour capturer des valeurs, ils seront ignorés.

Notez que vous pouvez placer plusieurs éléments Output sous une tâche pour capturer plusieurs paramètres ou simplement définir la même valeur pour plusieurs propriétés/groupes d'éléments.

+1

+1 pour l'élaboration. –

Questions connexes