无法通过本地生产轨道3.1.3服务器上的管道配置资产

时间:2012-01-18 05:53:18

标签: ruby-on-rails ruby-on-rails-3.1 asset-pipeline sprockets precompile

本月,我从Rails 3.0升级到Rails 3.1--本周我尝试在生产模式下启动服务器 - 今天我已经碰壁了!

我无法让我的生产环境服务器通过资产管道提供我的公共资产(JavaScript和CSS),除非我在environment.rb文件中设置了config.assets.compile = true,出于速度原因,我显然不想这样做。

我有大量的JS和CSS文件,每个文件都倾向于在一个或两个不同的页面上使用。这意味着创建单个“清单”文件不符合我的用法,因为每个页面都需要稍微不同的东西。我也期望一些CSS不会很好地融合在一起。因此,我采取了“只是让它工作”的方法,希望以后整理大量的CSS / JS。

这是production.rb文件:

Implicit::Application.configure do
  ...

  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # I set this to true, as I am testing this locally, just running a local Thin server
  config.serve_static_assets = true

  config.assets.compress = true

  # Setting this to false removes the issue - but is SLOW
  config.assets.compile = true

  config.assets.digest = true

  # This is overkill - but does get EVERYTHING precompiled for now
  config.assets.precompile += %w( *.css *.js )

  config.action_dispatch.x_sendfile_header = nil
  ...
end

这对我来说是一个相当新的领域,所以我今天花了很多时间来切换这些布尔值并停止/启动本地Thin / Rails服务器来试用它们。但唯一能够产生重大影响的是编译标志。

我的application.rb文件非常标准,其中包含config.assets.enabled = trueconfig.assets.initialize_on_precompile = false,后者来自heroku帖子(再次猜测)。

我有一个完全填充的public/assets目录,使用bundle exec rake assets:precompile命令创建,在我的旧笔记本电脑上运行大约需要20分钟(5年),可能与此相关“预编译正则表达式,虽然用该行评论它仍然需要超过10分钟(!)

将编译标志设置为true,我可以看到这些资产的副本在我的/tmp/cache目录中创建 - 这显然是应用程序创建它自己的资产的“编译副本”。 / p>

将编译标志设置为false时,我遇到错误消息(在日志中,除非我将请求设置为本地,然后我在呈现的错误页面上看到它)jquery.reveal isn't precompiled 。但是,当我转到http://localhost:3000/assets/jquery.reveal.js时,会提供javascript文件。

导致此问题的应用程序布局行是:

<%= javascript_include_tag "application", "jquery.reveal" %>

我尝试将jquery.reveal更改为jquery.reveal.js而没有任何更改。删除它修复了索引页面,除了jquery.reveal功能当然消失了!很明显,application.js正在正确提供。我只是无法弄清楚为什么jquery.reveal不是,因为我可以看到public / assets目录中的预编译文件。

2 个答案:

答案 0 :(得分:1)

在这里回答我自己的问题,但看起来这可能是解析具有“句点”的资产的错误,例如jquery.reveal

问题报告(https://github.com/rails/rails/issues/3398)会报告此事并突出显示一个提交(https://github.com/sstephenson/sprockets/commit/4ba5b32764a9073671df5e77355df6ed2bb3d3c9) Sprockets 2.0.3 - rails 3.1.3所依赖的默认版本。升级链轮因此需要移动到3.2稳定的导轨上 - 对于这个新手来说有点出血!

但是错误报告确实说这只发生在config.assets.compile = true - 我确实看到了我的代码中的情况,即jquery.reveal被动态编译为jquery-8fu ... 8g.reveal。 js(而不是jquery.reveal-8fu ... 8g.js)。

所以也许这不是答案。至少我希望不是。但是我肯定会继续关注这个时期的问题,因为据我所知,包含CSS / JS文件的“非期间”正在提供服务。

答案 1 :(得分:1)

这是一个有趣的问题,我认为可能存在两个错误 - 您链接的错误和另一个错误:文件被编译为错误的名称。可能值得尝试生成一个可以通过错误报告提交的最小测试用例。

对此的解决方法 - 我怀疑这就是为什么很少有人似乎遇到问题 - 是使用辅助清单(仅通过清单链接库似乎是一种不断发展的最佳实践)。

创建一个名为home.js并且只需要一个文件。

总体而言,这不是一个糟糕的方法。这些额外的清单必须添加到预编译数组中(请参阅指南),并允许在多个页面或部分上共享多个库,而无需每次都链接它们。