Разработка против производства fusebox.xml
Я работаю над приложением Fusebox с использованием Coldfusion, и есть fusebox.xml
файл, который я хотел бы немного отличать на производственном сервере от файла на сервере разработки. Так как кажется, что этот файл просто xml
файл (то есть: я не думаю, что это может быть cfm
файл), кажется, я не могу использовать некоторые if..else..
логика внутри fusebox.xml
,
Так что мне интересно, если мое предположение выше неверно, или есть ли способ использовать два файла, один для разработки и один для производства?
3 ответа
Вот что я сделал:
<!--For Development Mode = "development-full-load" , For Production Mode = "production" -->
<if condition="application.applicationname EQ 'xyz-dev'">
<true>
<parameter name="mode" value="development-full-load"/>
</true>
<false>
<parameter name="mode" value="production"/>
</false>
</if>
И, очевидно, имя приложения отличается для производственной среды, чем для среды разработки.
В старых проектах с fusebox.xml
мы используем другую копию конфига под названием server.xml
,
Этот файл обычно находится вне контроля исходного кода, поэтому он позволяет легко настраивать экземпляры приложения. Это структура почти такая же, как fusebox.xml
, но включает только атрибуты, которые мы хотим переопределить для текущего экземпляра, например источник данных или пути:
<?xml version="1.0" encoding="UTF-8"?>
<server>
<parameter name="mode" value="development-full-load" />
<parameter name="datasource" value="my_datasource" />
<parameter name="logRotatePeriod" value="50" />
<parameter name="someDataPath" value="/home/xxx/yyy/zzz/"/>
</server>
в fusebox.appinit.cfm
или же fusebox.init.cfm
(в зависимости от того, как часто этот файл изменяется или по любым другим причинам) этот файл анализируется и совпадает с записями в application.fusebox
обновляются. Например, вот функция для этого:
<cffunction name="loadLocalConfig" returntype="void" output="false" hint="Read and apply local server.xml configuration">
<cfscript>
var filesServerPath = application.fusebox.AppRootDirectory & application.fusebox.filesServer;
var fileParameters = "";
var oFileParameters = "";
var aServer = "";
var i = "";
if (FileExists(filesServerPath)) {
// read the contents
fileParameters = FileRead(filesServerPath);
// parse XML text into object
oFileParameters = XMLParse(trim(fileParameters));
// get fusebox parameters and update their values
if (StructKeyExists(oFileParameters, "server")){
aServer = oFileParameters.server.XmlChildren;
for (i=1; i LTE ArrayLen(aServer); i=i+1) {
if (aServer[i].XmlName EQ "parameter" AND StructKeyExists(application.fusebox, aServer[i].XmlAttributes.name)) {
application.fusebox[aServer[i].XmlAttributes.name] = aServer[i].XmlAttributes.value;
}
}
}
}
</cfscript>
</cffunction>
Кстати, для безопасности мы обычно переименовываем их в fusebox.xml.cfm
/server.xml.cfm
- это не делает его CFML-файлом, но защищает от прямого доступа без хитростей веб-сервера
Также стоит отметить, что в последних (с 2009 года) проектах на базе Fusebox мы использовали Application.cfc
для конфигурации. Это современные приложения с гораздо лучшим контролем над инициализацией и другие вещи, доступные как Application.cfc
методы.
При таком подходе Fusebox настраивается как FUSEBOX_PARAMETERS
объем. Еще проще переопределить его значения, просто включив server.cfm
файл и положить туда кусок простого CFScript с FUSEBOX_PARAMETERS.datasource = "my_datasource"
,
Мы не используем Fusebox, но у нас есть похожие файлы конфигурации, которые отличаются от dev для тестирования до производства. Мы просто храним все три версии в разных каталогах в репозитории и загружаем требуемую (производственную) версию на рабочие серверы. Поскольку эти файлы изменяются нечасто, это работает для нас.
Документы Fusebox, похоже, не указывают на способ использования другого fusebox.xml
но, возможно, специалист по Fusebox сможет это подтвердить.