2

以下是我想出的方法:

  1. 有一个不受版本控制的配置文件
  2. 根据已知开发服务器列表检查服务器名称/IP 地址
  3. 设置一些可以读取的环境变量

我在我的一些项目中使用了 (2),并且仅在一台开发机器上运行良好,但现在我们已经达到了 10 台左右,管理不断变化的列表可能会变得很困难。

(1) 我不喜欢,因为那是一个重要的文件,它应该是版本控制的。

(3) 我从未尝试过。当我们设置每台服务器时,它需要更多的配置,但这可能是一个不错的解决方案。

还有其他我想念的吗?有什么优点/缺点?

4

2 回答 2

1

(3) 不需要在服务器上进行更多配置。您可以改为默认为服务器模式,并且需要在开发机器上进行更多配置。

一般来说,我总是想让开发机器成为特例,并将发布行为设为默认值。唯一棘手的部分是,如果相关设置在配置文件中,那么开发人员会不断地意外检入他们修改后的文件版本。您可以在版本控制系统(例如签入挂钩)中避免这种情况,或者:

  • 读取两个配置文件,其中一个允许不存在(并且只存在于开发机器上,或者可能存在于专家用户设置的服务器上)
  • 读取允许不存在的环境变量。

我个人更喜欢有一个配置覆盖文件,因为你已经有了加载一个配置文件的代码,添加另一个应该很简单。读取环境并不难,当然,它只是一个单独的机制。

有些人真的很喜欢他们的程序由环境控制(尤其是那些想在从脚本运行时控制它们的人。当从脚本)。因此,可能值得使用该 POV 中的环境,但不仅限于此设置。

另一个完全不同的选项:如果您以适当的管理员权限登录应用程序,则可以在应用程序中配置开发/发布模式。这是否是一个好主意可能取决于您是否有那种编写调试日志消息的开发人员,“我懒得解决这个问题,但没有客户会说出区别,他们是都太傻了。” 如果是这样,(a) 不允许应用管理员启用调试模式 (b) 重新教育您的开发人员。

于 2012-05-28T15:59:58.687 回答
0

这里有一些其他的可能性。

一些组织将开发机器放在一个网络上,将生产机器放在另一个网络上,例如dev.example.comprod.example.com. 如果您的组织采用这种做法,那么应用程序可以通过运行它的完全限定主机名来确定其环境,或者可能通过检查其 IP 地址中的某些位来确定其环境。

另一种可能性是使用可嵌入的脚本语言(想到 Tcl、Lua 和 Python)作为配置文件的语法。这样做意味着您的配置文件可以轻松查询环境变量(或 IP 地址)并使用它来驱动if-then-else语句。这种方法的一个缺点是有人编辑配置文件以添加恶意代码(例如,删除文件)的潜在安全风险。

最后一种可能性是通过 shell/Python/Perl 脚本启动每个应用程序。该脚本可以查询其环境,然后使用它来驱动一个if-then-else语句,以将命令行选项传递给“真实”应用程序。

顺便说一句,我不喜欢编写if-then-else如下的环境测试语句:

if (check-for-running-in-production) {
    ... // run program in production mode
} else {
    ... // run program in development mode
}

check-for-running-in-production如果尚未更新测试以处理新添加的生产机器,则上述逻辑会静默中断。相反,如果更喜欢防御性地编写代码:

if (check-for-running-in-production) {
    ... // run program in production mode
} else if (check-for-running-in-development) {
    ... // run program in development mode
} else {
    print "Error: unknown environment"
    exit
}
于 2012-05-28T20:12:39.890 回答