2009-12-07 12 views
4

J'ai un projet Ant existant et je voudrais accélérer le processus de construction en évitant de reconstruire des composants qui sont déjà à jour.Éviter de recréer les prérequis dans Ant

Ant vous permet de spécifier qu'une cible dépend d'une autre, mais par par défaut chaque condition préalable est toujours reconstruite, même si elle est déjà antérieure à . (Ceci est une différence essentielle entre Ant et faire par défaut, faire ne re-construit une cible en cas de besoin -.. Que, si une condition sine qua non est plus récente)

<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task 
    ... 
</uptodate> 
<!-- The prerequisites are executed before the "unless" is checked. --> 
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate"> 
    ... 
</target> 

Pour faire Ant re-construction conditions préalables seulement si nécessaire, il semble y avoir deux approches générales dans Ant.

La première approche consiste à utiliser la tâche uptodate pour définir une propriété. Ensuite, votre tâche peut tester la propriété et construire uniquement si la propriété est (non) définie.

<uptodate property="mytarget.uptodate"> // in set.mytarget.uptodate task 
    ... 
</uptodate> 
<!-- The prerequisites are executed before the "unless" is checked. --> 
<target name="mytarget" depends="set.mytarget.uptodate" unless="mytarget.uptodate"> 
    ... 
</target> 

Une première approche alternative est d'utiliser la tâche outofdate de contrib fourmi. Il est préférable que ce soit juste une cible sans qu'une propriété séparée soit définie ; en revanche, outofdate nécessite des cibles distinctes pour définir et tester la propriété. La seconde approche consiste à créer un <fileset> en utilisant le sélecteur <modified> . Il calcule les hachages MD5 pour les fichiers et sélectionne les fichiers dont le MD5 diffère des valeurs précédemment stockées. Il est facultatif de régler

<param name="cache.cachefile"  value="cache.properties"/> 

à l'intérieur du sélecteur; il est par défaut "cache.properties". Voici un exemple qui copie tous les fichiers de src à dest dont le contenu a changé:

<copy todir="dest"> 
     <fileset dir="src"> 
      <modified/> 
     </fileset> 
    </copy> 

Aucune de ces derniers est très satisfaisant, car il me demande d'écrire du code Ant pour un processus (évitant reconstruction) qui devrait être automatique.

Il y a aussi Ivy, mais je ne peux pas dire à partir de sa documentation si c'est qui fournit cette fonctionnalité. Le cas d'utilisation clé dans la documentation Ivy semble être de télécharger des sous-projets à partir d'Internet plutôt que d'éviter de gaspiller le travail en mettant en scène les parties d'un même projet. Maven offre une fonctionnalité similaire à , avec le même cas d'utilisation mis en évidence dans sa documentation. (Déplacement d'un projet non trivila existant à Maven est dit être un cauchemar, en revanche, à partir du développement greenfield avec Maven est plus acceptable.)

Y at-il une meilleure façon?

Répondre

1

Cette compilation conditionnelle d'une grande construction est une caractéristique de faire que j'ai manqué initally dans ANT. Plutôt que d'utiliser des dépendances cibles, je suggérerais de diviser votre grand projet en modules plus petits, chacun publiant dans un référentiel partagé commun.Ivy peut ensuite être utilisé pour contrôler les versions de composants utilisées par le module principal du projet.

<ivy-module version="2.0"> 
    <info organisation="com.myspotontheweb" module="multi_module_project"/> 
    <publications> 
     <artifact name="main" type="jar"/> 
    </publications> 
    <dependencies> 
     <dependency org="com.myspotontheweb" name="component1" rev="latest.integration"/> 
     <dependency org="com.myspotontheweb" name="component2" rev="latest.integration"/> 
     <dependency org="com.myspotontheweb" name="component3" rev="latest.integration"/> 
     <dependency org="com.myspotontheweb" name="component4" rev="latest.integration"/> 
    </dependencies> 
</ivy-module> 

Le lierre: récupérer tâche ne télécharger/copier un des sous-modules si elles ont changé (publié à partir de leurs fichiers de construction)

Tout cela semble plus compliqué mais peut-être que vous êtes Vous pouvez déjà subdiviser le projet dans votre fichier de construction .... Par exemple, si votre tâche ANT uptodate est en cours de réalisation, elle dépend de l'un des artefacts de construction.

+0

Cela fonctionnerait. Cela nécessite de re-architecturer complètement le projet dont j'ai hérité, avec une granularité fine, dans certains cas, dans des sous-projets qui ne sont pas naturels en tant qu'entités autonomes. C'est ce que je craignais. – mernst

+0

Découvrez la tâche IVY de buildlist. Cela pourrait contrôler la construction globale de votre projet, en fonction des dépendances déclarées des différents composants du projet. Oui, votre projet nécessiterait une restructuration, mais vous pourriez découvrir qu'il simule le processus de construction et améliore la visibilité de l'architecture globale. C'est un appel au cas par cas –