Есть ли способ динамически загружать файл свойств в NAnt?
-
09-06-2019 - |
Вопрос
Я хочу загрузить другой файл свойств на основе одной переменной.
В принципе, при выполнении сборки разработчика используйте этот файл свойств, при выполнении тестовой сборки используйте этот другой файл свойств, а при выполнении производственной сборки используйте еще третий файл свойств.
Решение
Шаг 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: окружающая среда= разработчик
- nant -D: окружающая среда=тест
- nant -D: окружающая среда=производство
Другие советы
Вы можете использовать include
попросите включить другой файл сборки (содержащий ваши свойства) в основной файл сборки.Тот Самый if
атрибут include
задача может протестировать переменную, чтобы определить, следует ли включать файл сборки:
<include buildfile="devPropertyFile.build" if="${buildEnvironment == 'DEV'}"/>
<include buildfile="testPropertyFile.build" if="${buildEnvironment == 'TEST'}"/>
<include buildfile="prodPropertyFile.build" if="${buildEnvironment == 'PROD'}"/>
У меня была похожая проблема, которую частично решил ответ от 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>
Способ, которым я делал подобные вещи, заключался в включении отдельных файлов сборки в зависимости от типа сборки с использованием важная задача.Возможной альтернативой могло бы быть использование начитанная задача в nantcontrib.