2 votes

Contournement de la propriété de la condition

Je veux utiliser une propriété de condition pour définir la valeur de la propriété à X si une autre propriété est définie et à Y sinon. Cependant, je ne veux pas que l'utilisateur puisse remplacer la propriété conditionnelle à partir de la ligne de commande.

Comment y parvenir ?

3voto

Jarekczek Points 2297

A partir de ant 1.8 pour certains cas d'utilisation local la tâche peut être applicable . Puisqu'une propriété est rendue locale, elle commence avec une valeur vide. Son champ d'application est limité à la cible actuelle, mais vous pouvez la passer aux cibles suivantes en utilisant la commande param argument dans antcall .

2voto

David W. Points 49436

Non, vous ne pouvez pas remplacer une propriété définie sur la ligne de commande. Du moins, ce n'est pas facile à faire. Le but de remplacer les propriétés sur la ligne de commande est de permettre aux utilisateurs de remplacer les valeurs par défaut afin de modifier la façon dont votre projet est construit. Par exemple :

 <property file="${basedir}/build.properties"/>
 <property name="javac.debug"  value="no"/>

 <target name="compile">
    <javac destdir="${main.destdir}"
         debug="${javac.debug}">

Par défaut, le code Java est compilé sans information de débogage. Peut-être que cela est fait pour rendre les fichiers jar plus petits, ou une interprétation plus rapide, ou peut-être pour rendre le code plus difficile à décompiler et à lire. Quelle que soit la raison, ce build ne mettra pas d'information de débogage dans les classfiles.

Cependant, les développeurs souhaitent disposer de ces informations de débogage et veulent donc pouvoir passer outre ce paramètre :

$ ant -Djavac.debug=true compile

Ou bien, ils peuvent créer un build.properties et y mettre la valeur.

Ce type de problème survient lorsque vous n'utilisez pas Ant pour les constructions. Je connais plusieurs sites qui utilisent Ant scripts pour effectuer les déploiements. Je décourage généralement cela car Ant n'est pas vraiment fait pour ce genre de choses. Par exemple, Ant n'a pas de logique intégrée ou de boucles. Une fois qu'une propriété est définie, elle ne peut pas être modifiée. Ce sont de bonnes idées pour un langage de construction, mais une idée terrible pour un langage de programmation d'usage général.

De plus, les développeurs ne devraient pas faire des constructions pour l'assurance qualité ou la production. Celles-ci devraient être effectuées par un serveur de construction qui ne modifiera pas les valeurs par défaut.


Maintenant, comment détruire tout ce système bien pensé et causer un ravage absolu :

Vous pouvez utiliser le ant-contribue tâches dans votre projet. Cela vous permettra d'accéder à l'application Ant Contrib. var pour annuler les propriétés.

Téléchargez le fichier ant-contrib.jar (quelle que soit la dernière version), et mettez-le dans un répertoire de type lib sous votre projet. Ensuite, vous pouvez faire ceci :

<project name="danger-will-robinson" default="package" basedir="."
   xmlns:ac="http://ant-contrib.sourceforge.net">

  <!-- Define the Ant-Contrib tasks -->
  <taskdef=resource="net/sf/antcontrib/antlib.xml"
       uri="http://ant-contrib.sourceforge.net">
       <classpath>
            <fileset dir="${basedir}/lib">
                <include name="ant-contrib*.jar"/>
            </fileset>
       </classpath>
  </taskdef>

  <!-- Unset Property "foo", so you can use it -->
  <ac:var name="foo" unset="true"/>

Notez que le <classpath> pointe vers le bocal ant-contrib dans le répertoire ${basedir}/lib répertoire. Si vous l'enregistrez dans votre dépôt de sources, cela permettra à tous ceux qui vérifient votre projet d'être en mesure d'effectuer la construction sans installer le jar ant-contrib sur leur système.

Notez que j'ai défini un "ac" Espace de noms XML Ainsi, les tâches de Ant-Contrib ne chevaucheront pas d'autres tâches éventuelles de tiers.

1voto

Rebse Points 5278

Les propriétés de l'ensemble ant once sont immuables par conception. Vous pouvez écraser une propriété existante avec n'importe quel langage de script qui fournit un accès à l'API de ant, c'est-à-dire javascript.
Le JDK >= 1.6 est déjà livré avec un moteur javascript, vous pouvez donc utiliser quelque chose comme :

<project>

 <property name="x" value="whatever"/>

 <script language="javascript">
  project.getProperty('x') ?
   project.setProperty('foo', 'true') :
    project.setProperty('foo', 'false');
 </script>

 <echo>$$[foo} => ${foo}</echo>

</project>

hors de la boîte.
Mais cela ne servira à rien si quelqu'un utilise ant -f yourbuild.xml -Dfoo=bla ! ! car les userproperties (les propriétés définies via -Dkey=value) ont une protection spéciale.
Ainsi, votre exigence " Cependant, je ne veux pas que l'utilisateur soit en mesure de remplacer la propriété de la condition à partir de la ligne de commande".
n'est pas remplie.

Mais le let tâche de Ant addon Flaka offre la possibilité d'écraser même les propriétés de l'utilisateur :

<project xmlns:fl="antlib:it.haefelinger.flaka">

<property name="x" value="whatever"/>

 <!--
  := defines a new property whereas
  ::= overwrites any existing property
  even userproperties
 -->
 <fl:let> foo ::= has.property['x'] ? 'true' : 'false'</fl:let>

 <echo>$$[foo} => ${foo}</echo>

</project>

Exécutez les deux scripts avec ant -f yourbuild.xml -Dfoo=bla pour voir la différence.

Ant api a aussi la méthode project.setUserProperty(String,String) que vous pouvez utiliser aussi :

...
 <script language="javascript">

 project.getProperty('x') ?
    project.setProperty('foo', 'true') :
    project.setProperty('foo', 'false');

 project.getUserProperty('x') ?
  project.setUserProperty('foo', 'true') :
  project.setUserProperty('foo', 'false');

 </script>
...

pour empêcher la propriété foo d'être définie via .. -D .. et cela fonctionnera même si la propriété x est définie sur la ligne de commande -Dx=quelque chose
Vous devez faire votre choix, script tâche avec javascript out of the box ou Flaka let task. solution on line mais Flaka jar nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X