【问题标题】:Rails3: How to use the asset pipeline to build static assetsRails3:如何使用资产管道构建静态资产
【发布时间】:2012-11-01 17:08:17
【问题描述】:

所以我开始研究 Rails3 中的资产管道,并且我有一个想要的用例,它有点偏离常规......所以我正在寻找一个秘诀。

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

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

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

混乱

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

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

  • 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,这不是什么大问题,但我只是想知道是否可行。

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

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


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

参考文献

【问题讨论】:

  • 如果您使用 Sprockets 提前编译资产,您需要 Sprockets 稍后再次读取清单;这一切都流经Sprockets::Helpers::RailsHelper。如果您不能在生产中使用 Sprocket(“我们的限制,抱歉”),您也应该在开发中将其删除。
  • 是的,我对它的了解越多以及这些部分如何组合在一起,我就越有这种印象。谢谢!我们在如何设置我们的应用程序方面没有很大的灵活性——另一个团队在部署的环境中管理 Apache 和 Passenger,但在 rails 应用程序中使用 sprocket 可能没问题。

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


【解决方案1】:

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

配置

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

config/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

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

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

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

$ rails s -e 阶段

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2012-03-04
    • 2015-10-07
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    相关资源
    最近更新 更多