开发与生产fusebox.xml

时间:2011-02-14 22:37:56

标签: coldfusion fusebox

我正在使用Coldfusion处理Fusebox应用程序,并且有一个fusebox.xml文件,我希望在生产服务器上与在开发服务器上略有不同。由于看起来这个文件只是一个xml文件(即:我认为它不能是cfm文件),我似乎无法在{{if..else..内使用fusebox.xml个逻辑1}}。

所以我想知道我的上述假设是否错误,或者是否有办法使用两个文件,一个用于开发,一个用于生产?

3 个答案:

答案 0 :(得分:3)

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.cfmfusebox.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文件,并在其中添加一块带有FUSEBOX_PARAMETERS.datasource = "my_datasource"的普通CFScript。

答案 1 :(得分:2)

这是我做的:

<!--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>

显然,生产环境的应用程序名称与开发环境的不同。

答案 2 :(得分:0)

我们不使用Fusebox,但我们有类似的配置文件,不同于开发测试到生产。我们只将所有三个版本保存在存储库中的不同目录中,并将所需(生产)版本上载到生产服务器。由于这些文件不经常更改,这对我们有用。

Fusebox docs似乎没有表明使用其他fusebox.xml的方法,但也许Fusebox的专家可以确认。