将自定义信息传递给mongrel_rails开始

时间:2010-04-07 21:08:32

标签: ruby-on-rails command-line service mongrel

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

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

添加到客户特定模块的路径

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

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

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

以下是我看过的内容:

  1. 传递额外参数:

    mongrel_rails start --target XYZ ...

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

    mongrel_rails启动-C x:\ myapp \ myconfig.yml

  3. 修改文件:

    红宝石\ lib中\红宝石\宝石\ 1.8 \宝石\杂种-1.1.5 86 mswin32-60 \ lib中\杂种\ command.rb

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

  5. 1和2根本不起作用。我玩了4但从未设法做任何事情。所以我别无选择,只能选择3.虽然它相对简单,但我讨厌更改ruby库代码。

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

    如果有人知道如何使用现有的基础设施更优雅地做到这一点,我可以放弃巧克力鱼!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

如果每个客户都在自己的目录中,请执行以下操作:

/src
  /customer1
  /customer2
  /customer3

如果你用类似的东西开始你的mongrel进程:

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

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

target:
  Amazone

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

修改您的environment.rb以查找具体命名的YAML文件是完全可以接受的。解析YAML文件相当容易,并且为每个客户管理自定义提供了很大的灵活性。