我有两种方法,这两种方法都很好用。我将首先从最简单的方法开始,这就是我所说的“静态”。当我没有很多特定于环境的设置时,我会使用它……也许是一小部分。
我假设您的应用程序有一个 Application.cfc 或 .cfm 文件。在那里,您可以设置一个变量,例如“application.environment”,默认情况下它会设置为“dev”。在整个应用中,您可以检查该变量以确定您所在的位置。
当您打包应用程序以进行部署时,您可以将 Application.cfc 文件更改为改为“”。
现在,这会很烦人,所以我只使用 ant。我只是在我的 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”的表:
位置 ID |地点名称 | LocDesc |设置1 |设置2 |设置 3| ……
1 |本地 | '本地主机环境' |任何.....
2 |开发 | '发展环境' |任何....
3 |测试 | '测试环境' |随便......
等等。
然后,我们有另一个名为“AppLocationHosts”的表
位置 ID |本地主机名
1 | '本地主机'
2 | '开发服务器名称'
2 | '其他开发服务器名称'
3 | '测试服务器名称'
3 | '其他测试服务器'
等等。
然后,在 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 和查询打开或关闭调试。虽然我必须说,但我强烈建议不要这样做。