我正在使用 Coldfusion 开发 Fusebox 应用程序,并且fusebox.xml
我希望生产服务器上的文件与开发服务器上的文件略有不同。由于看起来这个文件只是一个xml
文件(即:我不认为它可以是一个cfm
文件),看来我不能if..else..
在fusebox.xml
.
所以我想知道我上面的假设是否错误,或者是否有办法使用两个文件,一个用于开发,一个用于生产?
我正在使用 Coldfusion 开发 Fusebox 应用程序,并且fusebox.xml
我希望生产服务器上的文件与开发服务器上的文件略有不同。由于看起来这个文件只是一个xml
文件(即:我不认为它可以是一个cfm
文件),看来我不能if..else..
在fusebox.xml
.
所以我想知道我上面的假设是否错误,或者是否有办法使用两个文件,一个用于开发,一个用于生产?
在较旧的项目中,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
or中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 文件,但可以防止直接访问而无需使用 Web 服务器技巧
另外值得一提的是,在最新的(自 2009 年以来)基于 Fusebox 的项目中,我们已用于Application.cfc
配置。这些是现代风格的应用程序,可以更好地控制初始化和其他可用作Application.cfc
方法的东西。
通过这种方法,Fusebox 被配置为FUSEBOX_PARAMETERS
作用域。覆盖它的值甚至更容易,只需包含server.cfm
文件并将一大块普通的 CFScript 与FUSEBOX_PARAMETERS.datasource = "my_datasource"
.
这是我所做的:
<!--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,但我们有类似的配置文件,从开发到测试到生产都不同。我们只需将所有三个版本保存在存储库的不同目录中,并将所需的(生产)版本上传到生产服务器。由于这些文件很少更改,这对我们有用。
Fusebox文档似乎没有指出使用不同的方法,fusebox.xml
但也许 Fusebox 的专家可以证实这一点。