Есть ли способ динамически загрузить файл свойств в NAnt? - PullRequest
20 голосов
/ 17 сентября 2008

Я хочу загрузить другой файл свойств на основе одной переменной.

В основном, если вы выполняете сборку dev, используйте этот файл свойств, если вы делаете тестовую сборку, используйте этот файл других свойств, а если вы производите сборку, используйте еще третий файл свойств.

Ответы [ 4 ]

26 голосов
/ 18 сентября 2008

Шаг 1 : определите свойство в вашем сценарии NAnt, чтобы отслеживать среду, для которой вы строите (локальную, тестовую, производственную и т. Д.).

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

Шаг 2 : Если у вас еще нет цели конфигурации или инициализации, от которой зависят все цели, то создайте цель конфигурации и убедитесь, что другие ваши цели зависят от нее.

<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>

Шаг 3 : обновите целевой объект конфигурации, чтобы получить соответствующий файл свойств на основе свойства среды.

<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>

Обратите внимание, я хотел бы разрешить членам команды определять свои собственные файлы local.config.xml, которые не попадают в систему контроля версий. Это удобное место для хранения локальных строк подключения или других настроек локальной среды.

Шаг 4 : установить свойство среды при вызове NAnt, например ::

  • nant -D: environment = dev
  • nant -D: среда = тест
  • nant -D: окружающая среда = производство
5 голосов
/ 08 октября 2008

У меня была похожая проблема, которую частично решил ответ scott.caligan, однако я хотел, чтобы люди могли установить среду и загрузить соответствующий файл свойств, просто указав цель следующим образом:

  • nant dev
  • тест Нанта
  • этап nant

Вы можете сделать это, добавив цель, которая устанавливает переменную среды. Например:

<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>
5 голосов
/ 17 сентября 2008

Вы можете использовать задачу include, чтобы включить другой файл сборки (содержащий ваши свойства) в основной файл сборки. Атрибут if задачи include может проверять переменную, чтобы определить, следует ли включать файл сборки:

<include buildfile="devPropertyFile.build" if="${buildEnvironment == 'DEV'}"/>
<include buildfile="testPropertyFile.build" if="${buildEnvironment == 'TEST'}"/>
<include buildfile="prodPropertyFile.build" if="${buildEnvironment == 'PROD'}"/>
0 голосов
/ 17 сентября 2008

Я сделал так, чтобы включить отдельные файлы сборки в зависимости от типа сборки, используя задачу nant . Возможной альтернативой может быть использование задачи iniread в nantcontrib .

...