0

我真的不明白的一件事是如何将自定义启动选项传递给杂种实例。

我看到一种常见的方法是使用环境变量,但在我的环境中这不起作用,因为我的 rails 应用程序服务于许多不同的客户端。许多代码在客户端之间共享,但也有许多差异,我通过子类化控制器和视图来重载或扩展现有功能或引入新功能。为了使这一切正常工作,我只需将路径添加到客户端特定模块的模块加载路径 ($:)。

为了启动特定客户端的应用程序,我现在可以使用一个环境变量,比如 TARGET=AMAZONE。不幸的是,在某些系统上,我运行多个 mongrel 集群,每个集群服务于不同的客户端。其中一些系统在 Windows 下运行,为了启动 mongrel,我安装了 mongrel_services。显然,这使我的环境变量不合适。

将这些额外的数据传递给应用程序被证明是一个真正的挑战。首先,mongrel_rails service_install 将拒绝任何未记录的 [自定义] 命令行参数。我不太担心使用安装程序安装服务是微不足道的。

但是,即使我设法安装 mongrel_services 以便在运行时将自定义命令行选项 --target 传递给 mongrel_rails start,我也会收到错误消息,因为 mongrel_rails 无法识别开关。

所以这是我看过的东西:

  1. 传递一个额外的参数:

    mongrel_rails 开始 --target XYZ ...

  2. 使用配置文件并添加目标:XYZ,然后执行:

    mongrel_rails 开始 -C x:\myapp\myconfig.yml

  3. 修改文件:

    红宝石\lib\ruby\gems\1.8\gems\mongrel-1.1.5-x86-mswin32-60\lib\mongrel\command.rb

  4. 也许我可以使用 --script 选项,但我在上面找到的所有文档都是针对 Unix 的

1和2根本不起作用。我和 4 一起玩过,但从来没有让它做任何事情。所以我别无选择,只能选择 3。虽然它相对简单,但我讨厌更改 ruby​​ 库代码。

特别令人失望的是 2 不起作用。我的意思是在配置文件中添加其他 [自定义] 选项有什么不合理的?实际上,我认为这是 Rails 中缺少的基本部分。不知何故,应用程序应该能够注册和访问它期望的命令行参数。

如果有人知道如何使用当前的基础设施更优雅地做到这一点,我有一条巧克力鱼要赠送!!!

4

1 回答 1

0

可能没有必要向杂种传递一些东西。可以使用现有的机制来提供您所寻求的灵活性。让我们首先尝试非常清楚这些约束。

换句话说,似乎以下条件有效。

  • 相同的代码库(或非常相似的代码库)用于服务多个客户
  • 在应用程序启动(或执行之前)需要影响应用程序执行的标识符来定义应用程序行为
  • 可以在单个系统上使用多组 mongrel 集群,每个集群专用于单个客户端
    • 这意味着一组进程都在为具有相同配置值的相同代码库提供服务
  • 一些客户希望在 Windows 服务器上运行,这避免了使用一些 Unix 风格的环境和脚本行为。

应该验证的一个假设是每个代码库都在一个单独的目录中。如果是这样,那么可能有一个非常简单的解决方案。

如果每个客户都在自己的目录中,如下所示:

/src
  /customer1
  /customer2
  /customer3

如果您使用以下内容开始您的杂种进程:

[/src/customer1]$ mongrel_rails cluster::start

然后,您可以拥有一个customer_config.yml在系统启动时读取的文件(在您的 environment.rb 中),您可以在其中放置您的客户端自定义值。因此,如果您需要传入“Amazone”作为目标值,那么您的 yaml 文件可能如下所示:

target:
  Amazone

然后,每个客户都会获得他们自己的 customer_config.yml 文件,该文件仅驻留在他们的目录中,您只需更改一个文件即可在添加新客户时切换行为。

修改你的 environment.rb 来寻找一个特别命名的 YAML 文件是完全可以接受的。解析 YAML 文件相当容易,它为管理每个客户的自定义提供了很大的灵活性。

于 2010-04-07T21:33:21.860 回答