Heroku Rails 3.1 应用 - 本地编译资源与在 Slug 编译期间编译资源的区别

13
我正在Heroku Cedar堆栈上运行一个支持资产管道的Rails 3.1应用程序。Heroku列出了三种编译资产的方法:
  1. 本地编译资产。
  2. 在slug 编译过程中编译资产。
  3. 在运行时编译资产。
显然,#3对性能不利,而且Heroku文档也不建议使用它。但我不确定#1和#2哪个更好。
#1需要你运行rake assets:precompile并将你的public/assets文件夹包含在git中。这将使您的slug变得更大,但我认为站点部署的停机时间将更短。但是,较大的slug大小意味着应用程序启动速度较慢,因此可能会互相抵消。
#2会使更新部署需要更长的时间,因为预编译是在Heroku端完成的。但是,您将拥有较小的slug,并且要管理/记住的内容较少。 我的问题是 - #1或#2哪个选项对于生产环境最好?为什么? 到目前为止,看起来选项#2比较好,但我想确保自己没有忽略任何东西。

http://devcenter.heroku.com/articles/cdn-asset-host-rails31 这篇文章也值得一读——尽管它会将资产从您在Heroku上的应用程序同步到S3,因此它们仍然存在于您的slug中,但不是从Heroku提供服务。 - John Beynon
有时候选项 #2 并不总是可行的。Heroku 会在编译 slug 期间首先尝试编译它们,如果失败则在运行时执行。 - John Beynon
2个回答

7
我在这个问题中提出了一些问题和一个重要的陷阱: Rails 3.1.1 asset pipeline Heroku caching gotcha 如果#2对我有效,我更愿意使用它,这样我就不必提交编译后的资源,从而使git仓库臃肿。
在slug编译期间编译资产不会导致任何额外的停机时间,因为您现有的应用程序将保持运行状态,直到slug编译完成,所以不用担心。
我的建议是,如果可以满足您的需求,请选择#2。如果您最终选择了#1,则最佳实践是在运行rake assets:precompile之前使用git rm -r public/assets,以确保不留下任何垃圾。

更新:升级到Devise 1.5.0后,选项#2现在对我起作用了 - 比检查资产要干净得多。 - Jeff Cutler-Stamm
如果您别无选择,只能使用#1,那么为在Heroku上部署创建一个rake任务是个好主意。它将会 1) 删除pubic/assets 2) 预编译资源 3) 将新编译的资源提交到git 4) 推送到heroku。 - Dty
我的首选选项也是第二个 - 但我一直很困惑为什么它似乎需要很长时间才能完成。 它只应该是将十几个文件合并并进行gzip压缩。 或许最耗时的是检查语法等方面的缩小。 如有任何见解,敬请赐教。 - Brian Armstrong
@BrianArmstrong,我认为你说得对,编译的最长时间是缩小文件大小。你可能会喜欢我的turbo-sprockets-rails3 gem,它可以将你的资产预编译时间减少一半。(https://github.com/ndbroadbent/turbo-sprockets-rails3) - ndbroadbent

2
这可能取决于你的资源文件夹的大小(也许长期解决方案是将这些资源放在应用程序外部,并在S3或类似服务上托管它们)。
否则,我认为#1 在生产环境中是最好的,因为任何资源都可以立即使用和缓存。
我正在阅读Heroku关于assets的文档部分,他们似乎表明#2 只有在你忘记自己做时才会使用,作为一种便利。你将无法获得小型slug,因为资产准备的结果将包含在要部署的slug中。

非常有趣,slug 大小并没有变小。感谢提供这个信息。但是为什么 #1 中的缓存与 #2 不同呢? - Dty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接