2009-12-24 3 views
2

Lors de l'exécution de MSBuild, tout élément passé sur la ligne de commande à l'aide de /p:MyProp=value est accessible à partir de chaque script MSBuild appelé (via la tâche MSBuild) à partir du script principal. Comment puis-je définir une propriété accessible de la même manière pour chaque script, dans une tâche?MSBuild: comment créer une propriété globale?

Par exemple:

Script1.proj: 
[...] 
<Target Name="Test"> 
    <MSBuild Projects="Script2.proj"/> 
    <Message Text="Script1, GlobalProp1=$(GlobalProp1)"/> 
    <Message Text="Script1, GlobalProp2=$(GlobalProp2)"/> 
</Target> 

Script2.proj: 
[...] 
<Target Name="Test"> 
    <!-- ??? Set GlobalProp2 = VALUE2 ??? --> 
    <Message Text="Script2, GlobalProp1=$(GlobalProp1)"/> 
    <Message Text="Script2, GlobalProp2=$(GlobalProp2)"/> 
</Target> 

Si REALISER comme ceci: msbuild Script1.proj /p:GlobalProp1=VALUE1 les scripts ci-dessus produisent la sortie suivante:

Script2, GlobalProp1=VALUE1 
Script2, GlobalProp2= 
Script1, GlobalProp1=VALUE1 
Script1, GlobalProp2= 

Je voudrais Script2.proj de mettre GlobalProp2 en quelque sorte à produire la sortie suivante:

Script2, GlobalProp1=VALUE1 
Script2, GlobalProp2=VALUE2 
Script1, GlobalProp1=VALUE1 
Script1, GlobalProp2=VALUE2 

Est-ce possible, et si oui, comment?

J'ai vu des suggestions pour utiliser des variables d'environnement, mais il semble que la situation ne où cette aide est lorsque la variable est définie dans le script parent , et le script enfantest appelé à l'aide du Tâche Exec (sinon, la modification env.variable n'a aucun effet).

+0

btw variables d'environnement prennent également effet lors de l'appel de la tâche VCBuild, pas seulement la tâche d'exécution – stijn

Répondre

6

Étant donné que vous utilisez la tâche MSBuild, vous devez transmettre les propriétés souhaitées dans l'appel en utilisant l'attribut Propriétés, vous devriez donc changer votre exemple en.

<Target Name="Test"> 
    <MSBuild Projects="Script2.proj" 
     Properties="GlobalProp1=$(GlobalProp1);GlobalProp2=$(GlobalProp2)" 
    /> 
    <Message Text="Script1, GlobalProp1=$(GlobalProp1)"/> 
    <Message Text="Script1, GlobalProp2=$(GlobalProp2)"/> 
</Target> 

Les propriétés doivent être explicitement transmises, ceci est voulu.

Si vous voulez une intégration plus stricte, au lieu d'utiliser la tâche MSBuild, vous devez simplement importer le (s) fichier (s) qui va créer un script logique.

+0

Malheureusement, cela ne fonctionne pas dans l'autre sens - je veux passer une modification faite dans Script2 dans Script1. –

+2

Au lieu d'utiliser le script utilisant la tâche MSBuild, vous devez modifier votre processus pour simplement importer le fichier. Ceci fournit une intégration beaucoup plus forte. –

+0

Parfait - l'importation du script est la seule façon qui a réellement fonctionné jusqu'à présent. Je vais marquer cela comme accepté si vous mentionnez cela dans votre réponse. –

5

Vous pouvez utiliser le fichier rsp pour définir des propriétés globales. Ces propriétés sont visibles pour les projets enfants.

+0

Je ne vois pas comment mon "sous-script" ("Script2.proj") sera en mesure de les changer. Est-il possible de faire ce que je décris dans la question en utilisant des fichiers .rsp? –

Questions connexes