Есть ли способ динамически загружать файл свойств в NAnt?
Я хочу загрузить другой файл свойств на основе одной переменной.
В принципе, если для создания dev используйте этот файл свойств, если при выполнении тестовой сборки используйте этот другой файл свойств, а если в производственной сборке используется третий файл свойств,
Ответы
Ответ 1
Шаг 1. Определите свойство в NAnt script для отслеживания среды, для которой вы строите (локальная, тестовая, производственная и т.д.).
<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: environment = test
- nant -D: environment = production
Ответ 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 dev
- nant test
- nant stage
Вы можете сделать это, добавив цель, которая устанавливает переменную среды. Например:
<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 task. Возможной альтернативой может быть использование iniread task в nantcontrib.