我刚刚熟悉Rails 3.1,我花了一些时间来更新一个旧项目并试图弄清楚新资产管道在开发模式与生产模式之间的表现.
默认的config.assets.precompile设置只保护application.css和application.js,目的是将所有内容都作为单个样式表和单个javascript文件提供.
显然有些情况下我们不希望这样,所以我们可以在该配置变量的列表中添加项目…
这是我在进入生产时遇到沙盒项目的情况:
>浏览开发中的网站,看到一切正常.资产作为单独的文件链接,并且网站显示正确.
>将网站上传到我的服务器,并尝试让它在生产中运行.第一个错误是说“ie.css”(条件样式表)没有预编译. (我在Safari中,甚至不会下载此样式表:在呈现页面之前,从stylesheet_link_tag帮助程序引发了错误.)
> Ran rake资产:预编译并再次尝试.
>将有问题的项目添加到config.assets.precompile并再次尝试.
>将错误击倒在路边,直到遇到另一个资产错误.
> GOTO 3.
不知道如何解决这个问题,我绕圈了几次,直到我认为我得到了所有的资产,并且该网站正在生产中.然后我在MSIE中尝试了它并点击另一个错误500:“belated_png_fix.js”正在被有条件地加载,并且直到那时它才出现.
所以我的问题是,除了试验和错误或严重依赖集成测试之外,当资产管道发现某些样式表或javascript未添加到预编译列表时,我怎么能预测我的网站不会爆炸?
我也很好奇为什么缺少样式表资产会导致整个页面出错500而不是仅按需编译它或在请求该资产时提供404.这是故意“早早失败”的设计吗?
解决方法
我刚刚发布了一个名为
assets_precompile_enforcer的gem,它确保开发人员在开发过程中不会忘记将资产添加到config.assets.precompile.如果您通过javascript_include_tag或stylesheet_link_tag包含资产,则会引发异常,并且它与config.assets.precompile中的过滤器不匹配.
这意味着资产错误将在开发期间被捕获,而不是在部署到生产后被发现.