确定开发与生产

时间:2009-11-22 20:31:35

标签: coldfusion application.cfc

我应该使用什么方法来确定我是开发系统还是生产系统? 在this post from Ray Camden中,他展示了如何查看您所在的文件夹,因此这可能是一个指标。

在dev中,我希望关闭错误捕获,关闭模板,cfstoredproc和cfquery调试=“yes”,以及始终重新加载onRequestStart上的组件。

6 个答案:

答案 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中实现吗?