Rails3:如何使用资产管道构建静态资产

时间:2012-11-01 17:08:18

标签: ruby-on-rails ruby-on-rails-3.2 asset-pipeline

所以我开始调查Rails3中的资产管道,我有一个理想的用例,有点偏僻......所以我正在寻找食谱。

  • 我经常在本地运行webrick进行开发然后运行 用于部署的应用程序实例的Passenger + Apache。

  • app配置了一个suburi路径,例如http:// server / approot /...

  • 要使webrick路径像部署的实例一样工作,我将map '/approot' do run app添加到config.ru。现在webrick也在http:// local:3000 / approot /...

混乱

鉴于此设置,我尝试使用rake assets:precompile,并且在本地,部署 - 丢失文件,错误路径,萤火虫中的404等之间存在很多配置问题。这里有一些解决方案我'我试过了:

  • config.assets.initialize_on_precompile = falseapplication.rb以防止在预编译资产时尝试初始化production的应用(我们有几个已部署的环境,并将它们称为不同的名称,ug。) 。

  • config.assets.precompile += %w( *.js *.css )application.rb包含缺少的jquery.js和ujs以及rails.js等内容。

  • config.assets.prefix = "/approot/assets"更正上面的地图(在config.ru中)不适用于资产的问题,因此资产必须预编译为./public/approot/assets,但我不是确定如果只在本地运行,即如果我部署,我的资产路径是http:// server/approot/approot/(js|css|...)吗?

在预编译资产时,rake任务切换到env production,但是从Rails3文档中不清楚sprockets是否继续在本地动态编译并使用这些动态资产,或者它是否会提供静态资源而不是预编译资产?

  • 我尝试将config.serve_static_assets = true放入environments/development.rb,但我不确定这对config.assets.compress = falseconfig.assets.debug = true的效果如何。将assets.debug设置为false似乎隐藏了webrick日志中的GET请求,尽管我看到一篇文章说“解决了问题”[原文如此]。

食谱的要求

所以我想要一个执行以下操作的配方:

  • 资源从路径 http://server/approot/assets/...始终如一地正确提供,无论是在乘客还是webrick(即部署或本地)中运行。如果这是不可能的,那么我可以切换我的本地开发环境以使用Passenger + Apache,这不是什么大问题,但我只是想知道它是否可能。

  • 原始资产存在于/app/assets中,就像普通的Rails3一样,但是当我对它们进行预编译时,它们在部署的env中的工作方式完全相同,因此资产文件引用不会中断 (即现在,当路径明确设置为/assets/image/...时,有很多引用寻找/approot/assets/image...。(从Rails3文档中不清楚是否存在关于部署到root与suburi的假设,例如http:// server/assets/...http:// server/approot/assets/...

  • sprockets无法在已部署的环境中使用(我们的限制,抱歉)。所以这意味着rails3应用程序必须有效地看起来像一个静态资产应用程序。我知道这是预编译资产应该做的事情,但路径问题阻碍了我按照宣传的方式工作。


TL; DR - 如果我只知道它们的正确组合,我觉得我正在尝试很多可能有用的东西。

参考

1 个答案:

答案 0 :(得分:0)

好的,这是一个潜在的可怕的答案,但它似乎现在在两个环境中与webrick一起使用,而且是万圣节后的第二天(尽管我还没有在已部署的插槽中尝试过这种方法)。

配置

除非另有说明,否则一切都是rails new app代的默认值。

<强>配置/ application.rb中

config.assets.initialize_on_precompile = false

environments / production.rb (不是真正的生产,仅用于rake资产:预编译)

config.assets.css_compressor = :yui
config.assets.js_compressor = :uglifier

environments / stage.rb (这是我们部署的环境之一)

config.serve_static_assets = true

<强> config.ru

这是可怕的部分。我复制了地图,这样Rack就能同时服务于suburi和root。因此,显示布局的控制器操作可以有http:// server/approot/foo/index,而布局中的资源可以从http:// server/assets/...加载

map '/approot' do
  run AppRoot::Application
end

map '/' do
  run AppRoot::Application
end

在本地运行

$ rake assets:precompile
$ rails s

在firebug中,我看到链轮提供的单独部件(全部200 OK):

  • GET / approot /
  • 获取/assets/application.css?body=1
  • 获取/assets/jquery.js?body=1
  • 获取/assets/jquery.ujs.js?body=1
  • 获取/assets/application.js?body=1

好的,现在在本地测试一个“已部署”的插槽,看看编译的资产是否有效?

$ rails s -e stage

然后我看到正确的预编译资产(全部200 OK):

  • GET / approot /
  • 获取/assets/application-xxxxxxxxxxxxxxx.css
  • 获取/assets/application-xxxxxxxxxxxxxxx.js

好的,所以这不如真正的suburi解决方案那么好,我想我将在部署的插槽中遇到问题。第2轮,战斗!