0

所以我开始研究 Rails3 中的资产管道,我有一个想要的用例,它有点偏离了人迹罕至的道路......所以我正在寻找一个秘诀。

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

  • 该应用程序配置有 suburi 路径,例如 http://server/approot/...

  • 为了使 webrick 路径像部署的实例一样工作,我添加map '/approot' do run appconfig.ru. 现在 webrick 也在 http://local:3000/approot/...

混乱

鉴于这种设置,我尝试使用rake assets:precompile并且在本地、部署之间遇到了很多配置问题——缺少文件、不正确的路径、firebug 中的 404 等。这是我尝试过的一些解决方案:

  • config.assets.initialize_on_precompile = false为了application.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 = falseand一起使用config.assets.debug = true。将 assets.debug 设置为 false 似乎只是在 webrick 日志中隐藏了 GET 请求,尽管我看到一篇帖子说“解决了问题”[原文如此]。

配方要求

所以我想要一个执行以下操作的食谱:

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

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

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


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

参考

4

1 回答 1

0

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

配置

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

配置/应用程序.rb

config.assets.initialize_on_precompile = false

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

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

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

config.serve_static_assets = true

配置.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

在萤火虫中,我看到链轮提供的单独部分(全部 200 OK):

  • 获取 /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 阶段

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

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

好的,所以这不如真正的 suburi 解决方案好,我认为我在部署的插槽中会遇到问题。第二回合,战斗!

于 2012-11-01T20:11:37.293 回答