0

这个月,我从 Rails 3.0 升级到 Rails 3.1 - 这周我尝试以生产模式启动服务器 - 今天我碰壁了!

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

我有大量的 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 = true其中包含config.assets.initialize_on_precompile = false来自 heroku 帖子的后者(再次猜测)。

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

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

将编译标志设置为false时,我会遇到jquery.reveal isn't precompiled. 但是,当我转到http://localhost:3000/assets/jquery.reveal.jsjavascript 文件时,它会提供服务。

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

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

我已经尝试将 jquery.reveal 更改为jquery.reveal.js没有更改。删除它修复了索引页面,除了 jquery.reveal 功能当然消失了!很明显,application.js 得到了正确的服务。我只是不知道为什么 jquery.reveal 不是,因为我可以在 public/assets 目录中看到预编译的文件。

4

2 回答 2

1

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

问题报告 (https://github.com/rails/rails/issues/3398) 报告了这一点并突出显示了在 Sprockets 2.0 之后发生的提交 (https://github.com/sstephenson/sprockets/commit/4ba5b32764a9073671df5e77355df6ed2bb3d3c9)。 3 - rails 3.1.3 依赖的默认版本。因此,升级 Sprocket 将涉及移动到 3.2-stable rails - 对于这个新手来说有点前沿!

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

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

于 2012-01-19T03:52:44.810 回答
1

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

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

创建一个调用home.js并只需要一个文件。

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

于 2012-01-19T04:09:13.397 回答