我正在使用Coldfusion處理Fusebox應用程序,並且有一個fusebox.xml
文件,我希望生產服務器上的文件與開發服務器上的文件略有不同。由於看起來這個文件只是一個xml
文件(即:我不認爲它可以是cfm
文件),所以我似乎不能在fusebox.xml
內使用一些if..else..
邏輯。開發vs生產fusebox.xml
所以我想知道如果我上面的假設是錯誤的,或者如果有一種方法使用兩個文件,一個用於開發和一個用於生產?
我正在使用Coldfusion處理Fusebox應用程序,並且有一個fusebox.xml
文件,我希望生產服務器上的文件與開發服務器上的文件略有不同。由於看起來這個文件只是一個xml
文件(即:我不認爲它可以是cfm
文件),所以我似乎不能在fusebox.xml
內使用一些if..else..
邏輯。開發vs生產fusebox.xml
所以我想知道如果我上面的假設是錯誤的,或者如果有一種方法使用兩個文件,一個用於開發和一個用於生產?
這裏是我做過什麼:
<!--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>
而且很明顯的應用程序名稱是用於生產環境比它的開發環境不同。
我們不使用保險絲盒,但是我們有類似的配置文件,這些配置文件不同於開發測試生產。我們只將所有三個版本保存在存儲庫中的不同目錄中,並將所需(生產)版本上傳到生產服務器。由於這些文件很少發生變化,這對我們很有用。
保險絲盒docs似乎沒有指示使用不同的fusebox.xml
的方法,但也許Fusebox的專家可以證實這一點。
在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>
BTW,爲安全起見,我們通常會把重命名爲fusebox.xml.cfm
/server.xml.cfm
- 它不讓它CFML文件,而是從直接存取保護沒有Web服務器技巧
而且它值得一提的是,在最新的(2009年以來)的保險絲盒的項目,我們已經使用Application.cfc
進行配置。這些都是現代風格的應用程序,可以更好地控制初始化和其他可用的方法,如Application.cfc
方法。
使用此方法將熔絲盒配置爲FUSEBOX_PARAMETERS
範圍。覆蓋它的值甚至更容易,只需包含server.cfm
文件,並在其中放入一塊普通的CFScript,其中包含FUSEBOX_PARAMETERS.datasource = "my_datasource"
。
如果你正在尋找更換硬殼舊熔斷器,看看這個https://github.com/jamie-pate/FuseBoxFreedom – 2013-09-22 23:51:54