web-dev-qa-db-fra.com

Comment puis-je autoriser un fichier de propriétés Ant à remplacer la valeur définie dans un autre?

J'ai un fichier ant qui fait ce qui suit:

<property file="project.properties" description="Project configuration properties"/>
<property file="build-defaults.properties" description="default build configuration."/>
<property file="build.properties" description="local build configuration overrides"/>

Je veux avoir des valeurs par défaut définies dans build-defaults.properties (qui est archivé dans SCM) mais permettre aux développeurs de remplacer les valeurs dans un build.properties local afin qu'ils puissent travailler avec des chemins locaux.

Le problème est qu'il ne semble pas fonctionner; J'ai configuré cela, créé une substitution dans build.properties, mais la valeur de mon chemin reste celle définie dans build-defaults.properties. Comment est-ce que j'accomplis ceci?

31
Chris R

Le problème initial avec votre configuration est que vous avez build.properties et build-defaults.properties inversé.

Ant Properties sont définis une fois et ne peuvent jamais être remplacés. C'est pourquoi la définition d'une propriété sur la ligne de commande via un -Dproperty=value remplacera toujours tout ce que vous avez défini dans le fichier; la propriété est définie et rien ne peut la remplacer.

Donc, la façon dont vous voulez que cette configuration soit:

<property file="build.properties" description="local build configuration overrides"/>
<property file="project.properties" description="Project configuration properties"/>
<property file="build-defaults.properties" description="default build configuration."/>

Par ici:

  1. Tout ce qui est défini sur la ligne de commande a priorité sur build.properties
  2. Tout ce qui est défini dans build.properties remplace les autres valeurs
  3. etc. sur la ligne.
49
Tim Visher

En fait les propriétés des fourmis peuvent être remplacées . Voir la documentation de la tâche de propriété :

Normalement, les valeurs des propriétés ne peuvent pas être modifiées, une fois qu'une propriété est définie, la plupart des tâches ne permettent pas de modifier sa valeur.

Une des tâches pouvant remplacer la valeur de la propriété est script. Toute tâche personnalisée peut également utiliser cette porte dérobée. D'autres propositions sont en question propriété de surcharge du fichier de chargement Ant . C'est contraire à l'esprit de la fourmi et généralement inutile. Mais il est bon de savoir cela, car je viens d'avoir un problème opposé: pourquoi la valeur de la propriété a changé bien que c'est immuable.

Voici un exemple de cible qui utilise une tâche de script pour modifier la valeur d'une propriété. Il montre les méthodes de base pour travailler avec des propriétés. Toutes les méthodes sont décrites dans Ant Api qui n'est pas disponible en ligne. Vous devez télécharger le Ant Manual . Dans son répertoire api se trouve la documentation de l'API.

  <target name="t1">
    <property name="a" value="one" />
    <script language="javascript">
      sProp = project.getProperty("a");
      sProp = sProp.replace("e", "ly");
      project.setProperty("a", sProp);
      project.setNewProperty("a", "new value");
    </script>
    <property name="a" value="two" />
    <echo>a=${a}</echo>
  </target>

Comment configurer facilement la tâche script? Rendre la tâche de script exécutable avec le langage beanshell est un peu délicat et non -trivial, mais il est expliqué dans cette réponse . Cependant, comme Rebse , l'utilisation du langage javascript est prise en charge dès le départ dans jdk 6.

17
Jarekczek

La propriété Ant ne peut pas être remplacée à moins d'utiliser une macro et un plug-in javascript pour faire:

Étape 1: définir une fonction macro pour remplacer la propriété

 <!--overwrite property's value-->
    <macrodef name="set" >
        <attribute name="name"/>
        <attribute name="value"/>
        <sequential>
            <script language="javascript">
                <![CDATA[
                project.setProperty("@{name}", "@{value}");
                ]]>
            </script>
        </sequential>
    </macrodef>

Étape 2: utilisez la macro dans le fichier XML ant

<set
    name="your_target_property"
    value="your_value" or "${another_property}"     
</set>
4
HMK