如何在生产之前捕获rails资产管道中的错误?

时间:2011-09-02 02:28:57

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

我刚刚熟悉Rails 3.1,我花了一些时间来更新一个旧项目并试图弄清楚新资产管道在开发模式与生产模式之间的行为。

默认的config.assets.precompile设置仅包含 application.css application.js ,目的是将所有内容都作为单个样式表和单个样式表提供javascript文件。

显然有些情况我们不希望这样,所以我们可以在该配置变量的列表中添加项目......

以下是我在进入制作时遇到沙盒项目的情况:

  1. 浏览开发中的网站,发现一切正常。资产作为单独的文件链接,并且网站显示正确。
  2. 将网站上传到我的服务器,并尝试让它在生产中运行。第一个错误是说“ie.css”(条件样式表)没有预编译。 (我在Safari中,甚至不会下载此样式表:在呈现页面之前,错误是从stylesheet_link_tag帮助程序引发的。)
  3. rake assets:precompile并再次尝试。
  4. 将违规项添加到config.assets.precompile并再次尝试。
  5. 将错误击倒在路边,直到遇到另一个资产错误。
  6. GOTO 3。
  7. 不知道如何解决这个问题,我绕圈了几次,直到我认为我获得了所有资产并且该网站正在生产中。然后我在MSIE中尝试了它并点击了另一个错误500:“belated_png_fix.js”正在被有条件地加载,并且直到那时才出现。

    所以我的问题是,除了试验和错误或严重依赖集成测试之外,当资产管道发现某些样式表或javascript未添加到时,我怎么能预测我的网站不会爆炸预编译列表?

    我也很好奇为什么缺少样式表资产会导致整个页面出错500而不是仅按需编译它或在请求该资产时提供404。这是故意“早早失败”的设计吗?

4 个答案:

答案 0 :(得分:2)

我刚刚发布了一个名为assets_precompile_enforcer的gem,它可以确保开发人员在开发过程中不会忘记将资源添加到config.assets.precompile。如果您通过javascript_include_tagstylesheet_link_tag添加资产,则会引发异常,并且它与config.assets.precompile中的过滤器不匹配。

这意味着资产错误将在开发期间被捕获,而不是在部署到生产后被发现。

答案 1 :(得分:1)

我也遇到了与rails 3.1类似的问题。您可以做的最好的事情是安装capistrano多阶段并获得一个临时服务器。

如果出于任何原因无法做到这一点,请在您的计算机上安装虚拟机并尝试复制服务器环境。

答案 2 :(得分:1)

持续部署是一件好事,你应该做到这么简单,无论如何真的不是那么痛苦。话虽如此,config.assets.precompile可以使用正则表达式,那么你如何为顶级链轮“清单”文件提出标准,或者为不会捆绑的东西提供标准子文件夹? (请注意,我还没有尝试过这个......)

答案 3 :(得分:0)

这可能有点矫枉过正,但这对我有用(它给了我干净,编译的资产)。我在.bash_profile文件中有这个。

alias ggo='bundle exec rake assets:clean && bundle exec rake assets:precompile && git add . && git commit -m "precompile" && git push origin master && cap deploy'

这在我的config / environments / production.rb中(强制生产在需要时编译;如果我记得首先运行“ggo”,则不应该需要):

  config.assets.compile = true

所以,我的工作流程是: 代码 2. git add& git commit 3.如果我触摸CSS / SASS / JS / CoffeeScript文件,我会运行ggo。否则,我会进行正常的上限部署。