2011-02-07 4 views
2

J'ai un système de construction où la plupart des composants sont exactement les mêmes, donc je l'ai modifié pour utiliser 'import' sur un fichier commun pour la plupart des tâches de construction. Ensuite, le système de construction doit également construire tous les modules dont il dépend. J'ai donc à peu près ...Imports imbriqués dans Ant

common.xml 
project1.xml 
    - import common.xml 
project2.xml 
    - include project1.xml 
    - import common.xml 

Il y a une cible nommée 'build' dans common.xml. Je veux que project2 puisse inclure project1 et utiliser le point d'extension pour placer une dépendance sur la cible de construction. Mais pour une raison quelconque, il ne reconnaît pas que project1 a une cible de construction. Si je le change pour dépendre d'une cible définie dans project1.xml, alors ça va. Mais je dois être capable de spécifier une cible qui est en common.xml.

Y a-t-il un moyen de le faire?

Pas de fourmi-contrib. Le projet avait l'habitude de l'utiliser, mais j'essaie de m'en débarrasser pour ne pas avoir un code de système horrible, procédural. Le projet a de nombreux cas de dépendances qui ressemblent à un diamant et un graphique de dépendance approprié (celui que la fourmi génère automatiquement) aiderait grandement. J'ai donc créé quelques fichiers simples pour illustrer mon problème.

<project name="top" default="build"> 
    <include file="mid.xml" as="mid" /> 
    <target name="build"> 
    <antcall target="mid.build" /> 
    </target> 
</project> 

<project name="mid" default="build"> 
    <!-- <target name="build"> --> 
    <!-- <echo message="build mid" /> --> 
    <!-- </target> --> 
    <import file="common.xml" /> 
</project> 

<project name="common"> 
    <target name="build"> 
    <echo message="build common" /> 
    </target> 
</project> 

Échec. top.xml ne peut pas trouver mid.build. Quand je lance ant -p pour lister les cibles, il affiche build et common.build. J'ai donc essayé d'ajouter dans le fichier de construction mid.xml et je l'ai eu pour construire correctement. Le seul problème est maintenant que si je décommente le XML ci-dessus pour mid pour définir sa propre étape de construction, il est écrasé par l'importation et ignoré. Donc ça finit par devenir [build, common.build] au lieu de [build, mid.build].

Répondre

2

Essayez d'utiliser le include task à la place, notamment au niveau de mid.xml:

<project name="mid" default="build"> 
    <include file="common.xml" /> 
</project> 

Les tâches « inclure » et « importation » ont des approches alternatives pour tâche primordiale. Voir 'Comment est <importer> différent de <inclure>?' dans le include task docs:

La version courte: Utilisez l'importation si vous l'intention de passer outre une cible, sinon utilisation comprennent

On dirait que vous voulez que la cible « construire » commun à cueillir up, sauf si elle est définie au milieu. Le problème est qu'avec la tâche 'import', la version lue (c'est-à-dire common.xml) remplacera celle de mid.xml. Parce que 'include' n'autorise pas les remplacements, celui défini dans l'appelant (mid.xml) n'est pas substitué lorsque common.xml est lu.

Exemple: pour la mid.xml ci-dessus, ant -f top.xml rapports:

build: 

mid.build: 
    [echo] build common 

Avec une substitution de cible build en mid.xml:

<project default="build" name="mid"> 
    <target name="build"> 
    <echo message="build mid" /> 
    </target> 
    <include file="common.xml" /> 
</project> 

le résultat devient:

build: 

mid.build: 
    [echo] build mid 
Questions connexes