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

Ruby on rails 如何在生产之前捕获rails资产管道中的错误?,ruby-on-rails,ruby-on-rails-3.1,asset-pipeline,Ruby On Rails,Ruby On Rails 3.1,Asset Pipeline,我刚刚开始熟悉Rails 3.1,我花了一些时间更新一个旧项目,并试图找出新资产管道在开发模式和生产模式下的表现 默认的config.assets.precompile设置只允许application.css和application.js,目的是所有内容都应作为单个样式表和单个javascript文件使用 显然,有些情况下我们不希望这样,所以我们可以在该配置变量的列表中添加项 以下是我在投入生产时遇到的沙箱项目情况: 浏览了开发中的网站,发现一切正常。这些资源作为单独的文件链接,站点显示正确 将

我刚刚开始熟悉Rails 3.1,我花了一些时间更新一个旧项目,并试图找出新资产管道在开发模式和生产模式下的表现

默认的
config.assets.precompile
设置只允许application.cssapplication.js,目的是所有内容都应作为单个样式表和单个javascript文件使用

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

以下是我在投入生产时遇到的沙箱项目情况:

  • 浏览了开发中的网站,发现一切正常。这些资源作为单独的文件链接,站点显示正确
  • 将该网站上载到我的服务器,并尝试使其在生产中正常工作。第一个错误是说“ie.css”(一个条件样式表)没有预编译。(我在Safari中,这个样式表甚至不会被下载:错误是在呈现页面之前从
    stylesheet\u link\u标记
    helper中引发的。)
  • 运行rake资产:预编译并重试
  • 已将有问题的项添加到
    config.assets.precompile
    并重试
  • 将错误一脚踢开,直到它碰到另一个资产错误
  • 转到3
  • 不知道如何解决这个问题,我绕了几圈,直到我认为我得到了所有的资产,网站正在制作中呈现。然后我在MSIE中尝试了一下,发现了另一个错误500:“迟到的png\u fix.js”被有条件地加载,直到那时它才出现

    所以我的问题是,除了反复试验或严重依赖集成测试之外,当资产管道发现某些样式表或javascript没有添加到预编译列表时,我如何预测我的站点不会崩溃


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

    我在rails 3.1中也遇到过类似的问题。您可以做的最好的事情是安装capistrano multi-stage并获得一个暂存服务器


    如果出于任何原因,这是不可能的,请在您的计算机上安装一个虚拟机,并尝试复制您的服务器环境。

    这可能有些过分,但这对我来说是可行的(它为我提供了干净、已编译的资产)。我的.bash_配置文件中有这个

    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”,则不需要编译):

    因此,我的工作流程是: 1.代码 2.git添加和git提交
    3.如果我触摸CSS/SASS/JS/CoffeeScript文件,我就会运行ggo。否则,我将执行常规的cap部署。

    连续部署是一件很棒的事情,您应该知道它非常简单,实际上并不那么痛苦。这就是说,
    config.assets.precompile
    可以使用regex,那么您可以为顶级链轮“manifest”文件提供一个标准,或者为不捆绑的东西提供一个标准子文件夹吗?(请注意,我实际上还没有尝试过……

    我刚刚发布了一个名为gem的gem,它确保开发人员在开发时不会忘记向
    config.assets.precompile
    添加资产。如果您通过
    javascript\u include\u标记
    样式表\u link\u标记
    包含资产,并且该资产与config.assets.precompile中的筛选器不匹配,则会引发异常


    这意味着资产错误将在开发过程中被捕获,而不是在部署到生产环境后被发现。

    是的,基本上我已经这样做了。它属于“试错”的标题(当然可以通过一些集成测试实现自动化……也许没有更好的方法了。)我最近将一个旧应用程序转换为资产管道,没有任何问题。不过,我花了一段时间才弄明白一切是如何协同工作的。为了回答您的问题,您能否显示css和js文件的内容,特别是require语句?我也感兴趣的是,你是如何从视图中调用这些。最后,它们都在应用程序/资产中,还是您也在使用lib/assets和vendor/assets?这是一个有用的技巧,但问题是预编译只作用于它知道的项。诀窍在于找出从不同视图链接的资源,并确保它们被添加到列表中。
      config.assets.compile = true