Разработка против производства 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 сможет это подтвердить.

Другие вопросы по тегам