首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过更改ActionController::Base#page_cache_directory在Heroku上使用Jammit进行静态资产缓存

通过更改ActionController::Base#page_cache_directory在Heroku上使用Jammit进行静态资产缓存
EN

Stack Overflow用户
提问于 2011-02-12 19:26:33
回答 2查看 1.5K关注 0票数 3

我正在尝试使用Jammit为部署在Heroku上的Rails应用程序打包CSS和JS,由于Heroku的只读文件系统,它无法开箱即用。我所见过的如何做到这一点的每个示例都建议提前构建所有打包的资产文件。由于Heroku基于Git的部署,这意味着每次这些文件更改时,您都需要单独提交到存储库,这对我来说不是一个可接受的解决方案。相反,我希望更改Jammit用于将缓存的包写入#{Rails.root}/tmp/assets的路径(通过更改ActionController::Base#page_cache_directory),该路径在Heroku上是可写的。

我不明白的是,如何使用缓存的文件而不会每次都碰到Rails堆栈,即使使用缓存包的默认路径也是如此。让我解释一下我的意思:

当您使用Jammit的helper包含一个包时,它看起来如下所示:

代码语言:javascript
复制
<%= include_javascripts :application %>

它会生成这个脚本标记:

代码语言:javascript
复制
<script src="/assets/application.js" type="text/javascript"></script>

当浏览器请求这个URL时,实际发生的情况是它被路由到Jammit::Controller#package,后者将包的内容呈现给浏览器,然后向#{page_cache_directory}/assets/application.js写入一个缓存副本。其思想是这个缓存的文件是在第一个请求的基础上构建的,后续的请求应该直接服务于缓存的文件,而不会触及Rails堆栈。我看了一遍Jammit代码,我不知道这是怎么回事。什么可以防止后续对/assets/application.js的请求简单地再次路由到Jammit::Controller,并且永远不会使用缓存的文件?

我的猜测是,在我看不到的某个地方,有一个Rack中间件,如果它存在,它会为文件提供服务,如果它不存在,它会将请求转发给控制器。如果是这样,代码在哪里?当更改ActionController::Base#page_cache_directory (有效地更改Jammit写入缓存包的位置)时,它是如何工作的?由于#{Rails.root}/tmp位于公共文档根目录之上,因此没有映射到该路径的URL。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-13 14:19:23

问得好!这不是我自己设置的,但这是我一直想要研究的东西,所以您促使我这样做。这是我会尝试的(我自己很快就会试一试,但你可能会先我一步)。

代码语言:javascript
复制
config.action_controller.page_cache_directory = "#{Rails.root}/tmp/page_cache"

现在将您的config.ru更改为:

代码语言:javascript
复制
require ::File.expand_path('../config/environment',  __FILE__)
run Rack::URLMap.new(
   "/"       => Your::App.new,
   "/assets" => Rack::Directory.new("tmp/page_cache/assets"))

只需确保public/assets中没有任何内容,因为它永远不会被拾取。

备注:

  • 这是针对Rails 3的。不确定在Rails 2下的解决方案。
  • 它看起来像是Rack::Directory将缓存控制标头设置为12小时,因此Heroku会将您的资产缓存到Varnish。不确定Jammit是否在它的控制器中设置了它,但是即使它不设置,它也会被缓存,quickly.
  • Heroku现在也设置了ENV['TMPDIR'],所以如果你愿意,你可以用它来代替Rails.root + '/tmp'
票数 5
EN

Stack Overflow用户

发布于 2011-03-04 18:45:19

这可能会有用,它是用于不同的gem,但想法是相似的,我正在尝试让它与普通的资源助手一起工作。

http://devcenter.heroku.com/articles/using-compass

不幸的是,如果不修补/重写资产帮助器模块(类似于耦合的意大利面),似乎很难让rails做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4977780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档