1

我想知道是否有一种方法可以将RAILS_ENV的值直接传递到 Torquebox 服务器而无需通过部署描述符;类似于我如何使用 -D 选项将属性传递给 Java。

在过去的几周里,我一直在努力解决 Torquebox 的各种部署问题。我认为问题的很大一部分与将 gem 打包到 Knob 文件有关,这是在 Window 环境中管理它们的最实用的方法。我尝试过归档部署和扩展部署;有和没有外部部署描述符。

  • 使用外部部署描述符,我发现打包的 Gem 依赖项未正确部署,并且收到有关缺少依赖项的错误。

  • 扩展时,我不得不对依赖项和 Knob 中包含的内容进行大量修改,但最终我得到了部署。但是,扩展 Knob 中的某些文件被标记为失败(可能存在重复依赖项?),但它们并不影响整体部署。问题是当服务器重新启动时,第二次部署将失败,因为它无法重新部署以前失败的文件之一。

我发现唯一对我有用的是没有外部部署描述符的存档。但是,我仍然需要一种方法来告诉应用程序它在哪个环境中运行。我对每个环境都有不同的 Torquebox 实例,它们只运行一个应用程序,因此在服务器级别配置它是相当合理的。

在此问题上的任何帮助将不胜感激。非常感谢!

4

1 回答 1

1

我最终找到的解决方案是将RAILS_ENV作为 Java 属性传递给 Torquebox 服务器,然后在 Rails boot.rb初始化程序中设置ENV['RAILS_ENV']为该值。

第 1 步:设置 Java 属性

首先,您需要为 Torquebox 服务器设置 Rails Environment java 属性。为了符合标准的 Java 约定,我将其命名为rails.env

根据您的平台和配置,需要在以下脚本之一中进行此更改:

  • 使用 JBoss Windows 服务包装器: service.bat
  • 独立环境: standalone.conf.bat (Windows) 或standalone.conf (Unix)
  • 域环境:: domain.conf.bat (Windows) 或 domain.conf (Unix)

将以下行添加到上面的相应文件中以设置此 Java 属性:

set JAVA_OPTS=%JAVA_OPTS% -Drails.env=staging

-D选项用于设置 Java 系统属性。

第二步:根据 Java 属性设置 ENV['RAILS_ENV']

我们希望尽早设置 RAILS_ENV,因为很多 Rails 初始化逻辑都使用它。我们将应用程序逻辑注入 Rails 初始化过程的第一个机会是boot.rb

请参阅: http: //guides.rubyonrails.org/initialization.html#config-boot-rb

将以下行添加到boot.rb的顶部:

# boot.rb (top of the file)
ENV['RAILS_ENV'] = ENV_JAVA['rails.env'] if defined?(ENV_JAVA) && ENV_JAVA['rails.env']

这必须是文件中的第一件事,以便 Bundler 可以对环境做出明智的决策。

正如您在上面看到的,JRuby 的一个很少提及的特性是它通过ENV_JAVA全局映射(镜像ENVruby​​ 映射)方便地公开所有 Java 系统属性,因此我们可以使用它来访问我们的 Java 系统属性。

我们检查它ENV_JAVA是否已定义(即正在使用 JRuby),因为我们支持多个部署环境。

我强制使用 rails.env 属性,因为此时 *RAILS_ENV* 似乎已经具有默认值。

于 2013-09-24T13:52:43.590 回答