Question

Je souhaite charger un fichier de propriétés différent en fonction d'une variable.

Fondamentalement, si vous construisez une génération dev, utilisez ce fichier de propriétés, si vous effectuez une construction test, utilisez cet autre fichier de propriétés et, si vous effectuez une construction de production, utilisez encore un troisième fichier de propriétés.

Était-ce utile?

La solution

Étape 1 : définissez une propriété dans votre script NAnt pour suivre l'environnement pour lequel vous créez (local, test, production, etc.).

<property name="environment" value="local" />

Étape 2 : si vous ne disposez pas déjà d'une cible de configuration ou d'initialisation dont dépendent toutes les cibles, créez une cible de configuration et assurez-vous que vos autres cibles en dépendent.

<target name="config">
    <!-- configuration logic goes here -->
</target>

<target name="buildmyproject" depends="config">
    <!-- this target builds your project, but runs the config target first -->
</target>

Étape 3 : mettez à jour votre cible de configuration pour extraire un fichier de propriétés approprié en fonction de la propriété d'environnement.

<target name="config">
    <property name="configFile" value="${environment}.config.xml" />
    <if test="${file::exists(configFile)}">
        <echo message="Loading ${configFile}..." />
        <include buildfile="${configFile}" />
    </if>
    <if test="${not file::exists(configFile) and environment != 'local'}">
        <fail message="Configuration file '${configFile}' could not be found." />
    </if>
</target>

Remarque: j'autorise les membres de l'équipe à définir leurs propres fichiers local.config.xml qui ne sont pas validés pour le contrôle de source. Cela fournit un endroit agréable pour stocker des chaînes de connexion locales ou d'autres paramètres d'environnement local.

Étape 4 : définissez la propriété d'environnement lorsque vous appelez NAnt, par exemple:

  • nant -D: environment = dev
  • nant -D: environment = test
  • nant -D: environment = production

Autres conseils

Vous pouvez utiliser le include tâche pour inclure un autre fichier de construction (contenant vos propriétés) dans le fichier de construction principal. L'attribut if de la tâche include peut être testé sur une variable pour déterminer si le fichier de construction doit être inclus:

<include buildfile="devPropertyFile.build" if="${buildEnvironment == 'DEV'}"/>
<include buildfile="testPropertyFile.build" if="${buildEnvironment == 'TEST'}"/>
<include buildfile="prodPropertyFile.build" if="${buildEnvironment == 'PROD'}"/>

J'ai eu un problème similaire que la réponse de scott.caligan a partiellement résolu, mais je souhaitais que les gens puissent définir l'environnement et charger le fichier de propriétés approprié en spécifiant simplement une cible de la manière suivante:

  • nant dev
  • test de nant
  • étape intermédiaire

Vous pouvez le faire en ajoutant une cible qui définit la variable d’environnement. Par exemple:

<target name="dev">
  <property name="environment" value="dev"/>
  <call target="importProperties" cascade="false"/>
</target>

<target name="test">
  <property name="environment" value="test"/>
  <call target="importProperties" cascade="false"/>
</target>

<target name="stage">
  <property name="environment" value="stage"/>
  <call target="importProperties" cascade="false"/>
</target>

<target name="importProperties">
  <property name="propertiesFile" value="properties.${environment}.build"/>
  <if test="${file::exists(propertiesFile)}">
    <include buildfile="${propertiesFile}"/>
  </if>
  <if test="${not file::exists(propertiesFile)}">
    <fail message="Properties file ${propertiesFile} could not be found."/>
  </if>
</target>

La façon dont j'ai fait ce genre de chose est d'inclure des fichiers de construction séparés en fonction du type de construction en utilisant tâche nant . Une alternative possible pourrait être d’utiliser la tâche iniread dans nantcontrib . .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top