在不使用部署描述符的情况下将RAILS_ENV传递到Torquebox

时间:2013-09-17 13:09:49

标签: deployment jruby torquebox

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

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

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

  • 扩展后,我不得不在依赖项和旋钮中包含的内容中捏造很多,但最终还是让它部署了。但是,扩展旋钮中的某些文件被标记为失败(可能重复的依赖项?),但它们不会影响整体部署。问题是当服务器重新启动时,部署会在第二次失败时提到它无法重新部署以前失败的文件之一。

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

对此事项的任何协助将不胜感激。非常感谢你!

1 个答案:

答案 0 :(得分:1)

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

第1步:设置Java属性

首先,您需要为Torquebox服务器设置Rails环境java属性。为了保持标准的Java约定,我称之为 rails.env

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

  • 使用JBoss Windows Service Wrapper: 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系统属性。

第2步:根据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全局映射(镜像ENV ruby​​映射)方便地公开所有Java系统属性,因此我们可以使用它访问我们的Java系统属性。

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

我强制使用rails.env属性,因为看起来* RAILS_ENV *此时已经有一个默认值。