Есть ли способ динамически загружать файл свойств в NAnt?

#.net #build #automation #nant

Вопрос:

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

В принципе, при выполнении сборки разработчика используйте этот файл свойств, при выполнении тестовой сборки используйте этот другой файл свойств, а при выполнении производственной сборки используйте еще третий файл свойств.

Ответ №1:

Шаг 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:окружающая среда=dev
  • nant -D:окружающая среда=тест
  • nant -D:окружающая среда=производство

Комментарии:

1. Ваша строка <включить файл сборки=»${Файл конфигурации}» /> завершается для меня ошибкой с сообщением: «Задача не разрешена в целевых объектах. Должно быть, на уровне проекта».

Ответ №2:

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

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

Ответ №3:

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

  • нант дев
  • тест 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>
 

Ответ №4:

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