本月,我从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 = true
和config.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目录中的预编译文件。
答案 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
并且只需要一个文件。
总体而言,这不是一个糟糕的方法。这些额外的清单必须添加到预编译数组中(请参阅指南),并允许在多个页面或部分上共享多个库,而无需每次都链接它们。