2008-09-16 6 views
20

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

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

ответ

26

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

Ваша строка завершает работу с сообщением: «Задача не разрешена в целях. Должно быть на уровне проекта». – vakman 2011-10-03 20:34:03

0

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

5

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

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

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

  • Nant DEV
  • тест Nant
  • 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> 
Смежные вопросы