我应该使用什么方法来确定我是开发系统还是生产系统? 在this post from Ray Camden中,他展示了如何查看您所在的文件夹,因此这可能是一个指标。
在dev中,我希望关闭错误捕获,关闭模板,cfstoredproc和cfquery调试=“yes”,以及始终重新加载onRequestStart上的组件。
答案 0 :(得分:3)
我有两种方法,这两种方法都很好。我将从最简单的方法开始,这就是我称之为“静态”的方法。当我没有很多环境特定的设置时,我会使用它...也许是一小部分。
我假设您的应用有Application.cfc或.cfm文件。在那里,你可以设置一个变量,比如“application.environment”,默认情况下它被设置为“dev”。在整个应用程序中,您可以检查该变量以确定您的位置。
当您打包应用程序进行部署时,您可以将该Application.cfc文件更改为“”。
现在,这会变得烦人,所以我只是使用蚂蚁。我只是在build.xml中使用这样的东西,它与Application.cfc位于同一目录中:
<replace file="Application.cfc" token="DEV" value="PROD" casesensitive="true" />
然后压缩应用程序进行部署:
<zip destfile="${zipdir}/MyApp-Production.zip">
<zipfileset dir="." prefix="MyApp" />
</zip>
然后我部署了zip。如果我正在开发一个使用FTP而不是一些企业部署的小项目,那么我将只有一个ANT任务将FTP文件发送到我的生产服务器,它还将在Application.cfc上执行替换并推送那个文件也是。
对于我工作的大多数应用程序,我们使用两个数据库表来管理环境。我们这样做是因为我们有很多不同的环境,每个环境都有不同的设置,通常以文件系统和网络路径为中心,这些设置和网络路径因环境而异(我们不要谈论为什么它们不同......完全单独的讨论)。所以我们有一个名为“AppLocations”的表:
LocationID | LocName | LocDesc |设置1 | Setting2 |设置3 | ...... 1 |本地| 'Localhost Environment'|随你..... 2 |开发| '发展环境'|随你.... 3 |测试| '测试环境'|无论.....
等等。
然后,我们有另一个名为“AppLocationHosts”的表
LocationID | LocHostName 1 | 'localhost' 的 2 | 'devservername' 2 | 'otherdevservername' 3 | 'testservername' 3 | 'othertestserver'
等等。
然后,在Application.cfc中,在onApplicationStart中,我们执行此查询
SELECT TOP 1 *
FROM AppLocations
WHERE LocationID IN (SELECT LocationID FROM AppLocationHosts WHERE LocHostName = <cfqueryparam value="#CGI.HTTP_HOST#" cfsqltype="cf_sql_varchar"/>)
从那里,一旦我们根据http_host匹配知道我们所在的位置,我们将这些“设置”列设置到应用程序范围内:
<cfloop list="#qryAppPathLocations.ColumnList#" index="ColName">
<cfset application[ColName] = qryAppPathLocations[ColName]>
</cfloop>
这种方法并不适合所有人,但在一致性不同的奇怪环境中,这是一种非常灵活的方法。
现在,如果你实际上只有两个环境,其中一个是“localhost”而另一个是“www.myapp.com”,那么到目前为止最简单的方法就是在onApplicationStart上检查http_host并且如果您在“www.myapp.com”,那么您可以进行特定于生产的设置。也许在这里你设置像“request.querydebug = true”这样的东西,然后当你在制作中时,你可以关闭它。然后,您的查询可以使用该标志来确定是否为cfstoredproc和查询打开或关闭调试。虽然我必须说,但我强烈建议不要这样做。
答案 1 :(得分:1)
您是否可以在您的开发箱中为您的IP启用CFAdmin中的调试,然后使用IsDebugMode()?
答案 2 :(得分:1)
转储#server#scope,你会看到一些可能有用的密钥 - 例如ColdFusion的许可模式。
答案 3 :(得分:1)
我们使用的解决方案是设置当前实例的IP,并根据我们已知的“dev”IP进行检查。简单,容易,有效。
答案 4 :(得分:1)
这里有很多好的答案 - 我想提一下使用cgi.server_name,它可以与使用自定义DNS结合使用来指定你的开发环境。要使localhost正常工作,对于Windows上的IIS,请设置主机文件,例如:这样:
C:\ Windows \ System32 \ drivers \ etc \ hosts - 添加条目: 127.0.0.1 myapp.dev.mydomain.com.au
然后在IIS中将您的服务器映射到此DNS。
您的系统和uat服务器可能在您公司的DNS中正确设置,例如 myapp.systest.mydomain.com.au - 系统 myapp.uat.mydomain.com.au - uat myapp.mydomain.com.au - 制作
然后,在我的application.cfc中,我有一个getEnvironment(),在每次加载时调用以便于使用:
// get the environment based on cgi variables - top of application.cfc
this.stConfig = THIS.getEnvironment();
//... onApplicationStart
if (!stConfig.validEnvironment) {
writeOutput("Environment #cgi.server_name# not recognised");
return false;
}
// ...
public struct function getEnvironment () {
stConfig=structnew();
stConfig.validEnvironment = 1;
switch (cgi.server_name) {
// my dev environment
case "myapp.dev.mydomain.com.au": {
stConfig.env = "dev";
// +++
}
// my dev environment
case "myapp.systest.mydomain.com.au": {
stConfig.env = "systest";
// +++
}
// etc
}
return stConfig;
}
我还会将stConfig复制到请求范围。
现在,我也有很多其他的东西,并且有很多方法来实现环境的存储,例如:但基本上我发现DNS和cgi.server_name的组合特别适合管理环境。
Fwiw,我将根据我用于存储特定于环境的配置的环境名称在application.cfc中包含ini文件。我发现getProfileSections()对此非常有用,因为配置文件非常容易使用。我有一个在所有环境之间共享的公共文件,然后是那些需要针对每个环境定制的设置的特定于环境的文件。
答案 5 :(得分:0)
是否可以获取当前正在运行的应用程序的目录?
考虑应用程序的不同“实例”的此目录结构:
<强> /home/deploy/DevLevel.0/MyApp 强>
生产版
<强> /home/deploy/DevLevel.1/MyApp 强>
预览或暂存版本
<强> /home/deploy/DevLevel.2/MyApp 强>
开发版
如果您可以阅读当前应用程序的路径,则很容易在DevLevel
之后找到整数。有了这个(设置为全局变量/常量),使用它来改变运行时的设置或行为:
DevLevel == 0 means "Production"
DevLevel >= 1 means "Development"
例如,在信用卡授权码中:
if(DevLevel > 0)
enable_test_mode();
在错误处理代码中:
if(DevLevel == 0)
send_error_to_log();
else
print_error();
<强>结论强>
这里的主要好处是版本之间的代码可以保持 100%相同。不再“忘记启用此功能或在移动代码时禁用它”。
这可以在ColdFusion中实现吗?