Rails 未提供 Openshift 热部署资产

Rails Openshift Hot Deploy assets not served

我在 Openshift 上部署了一个 Rails 应用程序。我为热部署添加了标记,热部署本身工作正常,但在应用程序热部署期间 css 并且不提供 js 文件。当热部署结束时,这些文件再次正常工作。我在此应用程序中也使用 Bootstrap 和 Sass (gem 'bootstrap-sass')。你知道为什么会这样吗?

这些文件由 Apache 通过 Passenger 模块提供。文件正在被替换 "in place",这导致它们成为 removed/rebuilt,这导致它们在此期间无法提供,并且由于它们是静态资产,因此不会存储在内存中。不幸的是,目前没有办法使热部署与 Rails 完全配合使用,以在部署时保持站点 100% 正常工作。

一个解决方案是将您的资产放在一个单独的 运行 项目中,因为没有简单的方法让它们随时可用,正如@developercorey 解释的那样..

这可能不是最好的解决方案,但会是一个简单的补丁解决方案,不会与某个特定的托管平台紧密耦合。

我解决了这个问题,现在可以使用了。我会解释我做了什么,也许它会帮助别人。

基本上需要在本地预编译你的资产,然后提交和推送。这是由
rake assets:precompile RAILS_ENV=production

完成的

但是有个问题!!!本地预编译资产与 Openshift 上生成的资产不匹配。这怎么可能? Openshift 上有一个错误,资产是在 RAILS_ENV=development 的生产中生成的:/ 更多信息在这里:
https://github.com/openshift/origin-community-cartridges/issues/8
因此需要在您的应用程序中添加环境变量:
rhc set-env RAILS_ENV=production -a app_name
然后生成资产匹配。

所以在修复之后,当资产发生变化时,我们需要再次预编译它们。为了让它们在热部署期间工作,需要在 repo 中同时拥有旧的预编译资产和新的预编译资产。例如: 如果您有旧文件:
应用程序-10770925dc8abd4ceab34119af4032163cc5a94f3523d60d321f33a999171d58.css
和新的预编译文件:
申请-82f6fca47056cbda52cb32086051f031b880e2630a137f0e41e96cb2eef923ee.css
他们都必须在存储库中。在热部署期间旧资产仍然被引用,所以它必须在存储库中。热部署结束后,引用新资产。在下一次提交和推送中,旧资产可能会被删除。

所以基本上这个问题对我来说已经解决了,现在热部署工作正常。