2010-08-26 5 views
2

J'ai un ensemble de fichiers de construction Ant imbriqués, et j'ai besoin de contrôler quelles propriétés sont héritées par chaque tâche "sub". J'essaie de les définir comme des propertysets (pour garder le code gérable) mais ceux-ci ne sont pas hérités par les sous-tâches, contrairement aux propriétés.Héritage de propriété avec des tâches imbriquées

L'exemple ci-dessous illustre le problème, foo.* est copié dans le projet intermédiaire mais pas dans le projet inférieur. Si je définis chaque propriété à hériter explicitement, comme bar.*, ils héritent aussi du projet bottom.

Y a-t-il un moyen d'hériter un groupe de propriétés de la même manière que les propriétés individuelles? Sans réécrire les sous-processus, y a-t-il autre chose que je pourrais essayer?

[top.xml]

<?xml version="1.0"?> 
<project name="test-top"> 
    <property name="foo.1" value="1"/> 
    <property name="foo.2" value="2"/> 
    <property name="bar.1" value="1"/> 
    <property name="bar.2" value="2"/> 

    <ant antfile="middle.xml" inheritall="false"> 
     <propertyset> 
      <propertyref prefix="foo."/> 
     </propertyset> 
     <property name="bar.1" value="${bar.1}"/> 
     <property name="bar.2" value="${bar.2}"/> 
    </ant> 
</project> 

[middle.xml]

<?xml version="1.0"?> 
<project name="test-middle"> 

    <echo>foo ${foo.1} ${foo.2}</echo> 
    <echo>bar ${bar.1} ${bar.2}</echo> 

    <ant antfile="bottom.xml" inheritall="false"/> 
</project> 

[bottom.xml]

<?xml version="1.0"?> 
<project name="test-bottom"> 

    <echo>foo ${foo.1} ${foo.2}</echo> 
    <echo>bar ${bar.1} ${bar.2}</echo> 

</project> 

[SORTIE DE fourmi top.xml -f]

[echo] foo 1 2 
[echo] bar 1 2 
[echo] foo ${foo.1} ${foo.2} 
[echo] bar 1 2 

Répondre

2

Je pense que la solution d'Alexander est proche. Que diriez-vous cependant, n'a pas besoin de changer dans middle.xml ou bottom.xml.

L'idée est d'utiliser la tâche echoproperties pour «dérouler» le propertyset en propriétés individuelles, puis de l'utiliser dans l'appel de tâche ant.

Avant d'appeler middle.xml, écrire la propriété définie à l'aide de quelque chose comme ceci:

<echoproperties destfile="myproperties.txt"> 
    <propertyset> 
     <propertyref prefix="foo."/> 
     <propertyref prefix="bar."/> 
    </propertyset> 
</echoproperties> 

ensuite faire l'appel à middle.xml:

<ant antfile="middle.xml" inheritall="false"> 
    <property file="myproperties.txt" /> 
</ant> 

Propriétés fournies à la tâche ant inherit all the way down comme vous le dites, il vous suffit de modifier top.xml:

Ces propriétés deviennent équivalentes à propriétés que vous définissez sur la ligne de commande. Ce sont des propriétés spéciales et ils seront toujours transmis, même par l'intermédiaire de < et supplémentaires tâches avec inheritall mis à false (voir ci-dessus).

+0

Merci Martin, et Alexander. Je m'étais posé la question d'écrire les propriétés dans un fichier mais je n'avais vu aucun moyen de le faire sans réindexer explicitement toutes les propriétés que je voulais transmettre (ie pas mieux que la solution pour 'bar. *' Ci-dessus).J'avais raté la tâche "echoproperties" car elle était listée sous "Tâches facultatives" plutôt que "tâches de base" dans la documentation Ant ... maintenant je sais! –

1

Dans top.xml, vous pouvez créer un fichier avec des propriétés héritables à l'aide de la tâche <propertyfile>.

Ensuite, vous pouvez charger ce fichier avec <property file="..."/> dans chacun de vos sous-modules.

Questions connexes