我正在尝试使用Jammit为部署在Heroku上的Rails应用程序打包CSS和JS,由于Heroku的只读文件系统,它无法开箱即用。我所见过的如何做到这一点的每个示例都建议提前构建所有打包的资产文件。由于Heroku基于Git的部署,这意味着每次这些文件更改时,您都需要单独提交到存储库,这对我来说不是一个可接受的解决方案。相反,我希望更改Jammit用于将缓存的包写入#{Rails.root}/tmp/assets的路径(通过更改ActionController::Base#page_cache_directory),该路径在Heroku上是可写的。
我不明白的是,如何使用缓存的文件而不会每次都碰到Rails堆栈,即使使用缓存包的默认路径也是如此。让我解释一下我的意思:
当您使用Jammit的helper包含一个包时,它看起来如下所示:
<%= include_javascripts :application %>它会生成这个脚本标记:
<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。
发布于 2011-02-13 14:19:23
问得好!这不是我自己设置的,但这是我一直想要研究的东西,所以您促使我这样做。这是我会尝试的(我自己很快就会试一试,但你可能会先我一步)。
config.action_controller.page_cache_directory = "#{Rails.root}/tmp/page_cache"现在将您的config.ru更改为:
require ::File.expand_path('../config/environment', __FILE__)
run Rack::URLMap.new(
"/" => Your::App.new,
"/assets" => Rack::Directory.new("tmp/page_cache/assets"))只需确保public/assets中没有任何内容,因为它永远不会被拾取。
备注:
Rack::Directory将缓存控制标头设置为12小时,因此Heroku会将您的资产缓存到Varnish。不确定Jammit是否在它的控制器中设置了它,但是即使它不设置,它也会被缓存,quickly.ENV['TMPDIR'],所以如果你愿意,你可以用它来代替Rails.root + '/tmp'。发布于 2011-03-04 18:45:19
这可能会有用,它是用于不同的gem,但想法是相似的,我正在尝试让它与普通的资源助手一起工作。
http://devcenter.heroku.com/articles/using-compass
不幸的是,如果不修补/重写资产帮助器模块(类似于耦合的意大利面),似乎很难让rails做到这一点。
https://stackoverflow.com/questions/4977780
复制相似问题