我想知道是否有办法将 RAILS_ENV 的值直接传递到Torquebox服务器,而无需通过部署描述符;类似于我可以使用-D选项将属性传递给Java。
在过去的几周里,我一直在与Torquebox的各种部署问题进行斗争。我认为问题的很大一部分与将Gem打包到Knob文件有关,这是在Window环境中管理它们的最实用的方法。我已经尝试过存档部署和扩展部署;有和没有外部部署描述符。
使用外部部署描述符,我发现打包的Gem依赖项未正确部署,我收到有关缺少依赖项的错误。
扩展后,我不得不在依赖项和旋钮中包含的内容中捏造很多,但最终还是让它部署了。但是,扩展旋钮中的某些文件被标记为失败(可能重复的依赖项?),但它们不会影响整体部署。问题是当服务器重新启动时,部署会在第二次失败时提到它无法重新部署以前失败的文件之一。
我发现唯一一个为我工作的是没有外部部署描述符的存档。但是,我仍然需要一种方法来告诉应用程序它在哪个环境中运行。我为每个环境设置了不同的Torquebox实例,它们只运行一个应用程序,因此在服务器级别配置它是相当合理的。
对此事项的任何协助将不胜感激。非常感谢你!
答案 0 :(得分:1)
我最终得到的解决方案是将 RAILS_ENV 作为Java属性传递给Torquebox服务器,然后在Rails boot.rb中将ENV['RAILS_ENV']
设置为此值初始化程序。
第1步:设置Java属性
首先,您需要为Torquebox服务器设置Rails环境java属性。为了保持标准的Java约定,我称之为 rails.env 。
根据您的平台和配置,需要在以下脚本之一中进行此更改:
将以下行添加到上面的相应文件中以设置此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 *此时已经有一个默认值。