Exécuter la tâche Ant seulement si une condition est remplie
J'ai besoin d'exécuter une tâche Ant dans une cible spécifique, uniquement si une condition est remplie.
J'ai trouvé un moyen de définir la condition au niveau de la cible, mais pas au niveau de la tâche. J'ai aussi trouvé une contribution qui met en œuvre un SI la tâche.
Ma question est, êtes-vous au courant de toute façon d'atteindre cet objectif avec la norme des tâches Ant?
Une longue explication: je suis en train de démarrer Tomcat Serveur dans le cas où il est arrêté. Pour détecter si c'est arrêté je utiliser le code suivant:
<echo message="Checking whether Tomcat is running"/>
<condition property="tomcat.running">
<socket server="${tomcat.host}" port="${tomcat.port}"/>
</condition>
Donc ma prochaine tâche dans cet objectif, est un exec de la tâche qui doit être exécutée seulement si ${tomcat.running}
est faux. Et comme je l'ai dit, je ne veux pas ajouter une seule tâche dans une cible à moins bien.
Vous devez vous connecter pour publier un commentaire.
Une Fourmi cible peut disposer en option d'une
if
ouunless
clause. Cela signifie pour exécuter cette tâche que si la propriété est définie, avec unif
clause, ou n'est pas définie avec l'unless
clause1. Il est intéressant de noter, queif
ouunless
clause est cochée après tout dépendant de la tâche est exécuté.Cela signifie, vous pouvez le faire dans la norme Ant comme un moyen de l'exécution d'une tâche Ant seulement si une condition particulière est remplie:
Vous spécifiez que vous souhaitez Ant pour exécuter Cible
my.target
. Ant avis quemy.target
dépend de latest.if.tomcat.is.running
cible, et l'exécuter en premier. Letest.if.tomcat.is.running
tâche sera de définir latomcat.running
propriété si Tomcat est effectivement en cours d'exécution. Sinon, cette propriété n'est pas définie.Enfin, la Fourmi va revenir à la
my.target
cible et de voir si la propriététomcat.running
est définie, et n'exécutera la ciblemy.target
si elle est définie.Ou, vous pouvez utiliser l'Ant-contrib tâches, ce qui peut rendre l'ensemble de votre processus de construction plus facile à comprendre.
Si vous voulez aller de l'Ant-Contrib route, il y a un moyen facile pour l'installation de Ant-Contrib, de sorte que le Ant-contrib pot est en fait une partie de votre projet. Si quelqu'un vérifie votre projet à partir du système de contrôle de version, ils peuvent également obtenir de l'Ant-contrib pot, et donc de ne pas avoir à installer Ant-Contrib eux-mêmes.
De téléchargement de Ant-Contrib pot et le mettre dans un répertoire à la racine de votre projet appelé
antlib/ac
. Leantlib
peuvent être utilisés pour toutes sortes de tâche facultative pots comme Findbugs ou PMD. Vient de mettre chaque option Ant jar dans leur propre répertoire sousantlib
(Comme je l'ai mis Ant-Contrib sous laac
répertoire).Puis, dans votre
build.xml
, vous spécifiez l'Ant-Contrib tâches de cette façon:Maintenant, vous pouvez utiliser l'Ant-Contrib tâches sans se soucier de savoir si ou non ils sont installés sur une machine particulière ou non. Vous commander votre projet, et vous avez accès à ces tâches automatiquement.
1. C'est vrai, la
if/unless
clause vérifie si une propriété est définie et pastrue
/false
qui peut causer beaucoup de confusion. J'ai vu des développeurs de définir une propriété àfalse
ouno
, et se demandent ensuite pourquoi l'objectif est en fait de l'exécution depuis leif
clause est définie sur false.Depuis la version 1.9.1(*) et prend en charge l' si - et à moins que les conditions dans une plus fine façon sur n'importe quelle tâche, si vous déclarez la nécessaire espaces de noms à l'intérieur de l'élément de projet.
( * ) , Veuillez utiliser la dernière version de ant (1.9.6 de cette écriture), que la version 1.9.1 contient des failles WRT cette nouvelle fonctionnalité, en tant qu'utilisateur @Rebse aimablement fait remarquer.
Dans l'exemple ci-dessous, vous pouvez jouer autour de commenter/décommenter les propriétés...
... et d'observer les résultats comme ceci:
Si vous voulez un "if else" type de mise en œuvre:
Il ya des situations où vous n'êtes pas en mesure de rendre votre cible Ant dépend d'un autre Fourmi pour cible en raison de la si devrait être évalué sur la base d'une valeur initialisée juste avant le exec (je peux fournir un exemple clair, mais par souci de simplicité, je ne veut pas).
Sur les systèmes Unix une alternative (préférable dans certaines situations), est la suivante:
Au-dessus de la mon-bash-commande illustre la commande/programme que vous souhaitez exécuter, et le arguments ilustrates les arguments de cette commande.
Noter que lorsque le myprop n'est pas définie, alors le ${myprop} sera simplement évalué à la chaîne de caractères "$" + "{" + "myprop" + "}" (ie. "${myprop}"), donc il nous faut comparer la valeur de myprop à l'encontre de cette chaîne.
D'un autre côté quand myprop est définie, alors sa valeur est probablement la chaîne vrai/faux afin de vérifier SI notre condition est remplie, nous conseillons de comparer les myprop l'encontre de la chaîne vrai (ou quelle que soit la valeur que vous pouvez avoir).
Conclusion: à l'aide de la Fourmi exec combinée avec la commande de systèmes d'exploitation SI nous pouvons exécuter des commandes arbitraires OS les commandes/programmes sans la nécessité d'une autre cible Ant. En utilisant la même logique que ci-dessus le SI-comme la déclaration peut être programmé pour fonctionner même sur Windows.