8

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

默认config.assets.precompile设置仅适用于application.cssapplication.js,目的是所有内容都应作为单个样式表和单个 javascript 文件提供。

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

这是我在投入生产时使用沙盒项目遇到的情况:

  1. 浏览了开发中的网站,发现一切正常。资产被链接为单独的文件,并且站点正确显示。
  2. 将该站点上传到我的服务器,并尝试使其在生产中运行。第一个错误是说“ie.css”(一个条件样式表)没有预编译。(我在 Safari 中,甚至不会下载此样式表:stylesheet_link_tag在呈现页面之前,该错误是从帮助程序中引发的。)
  3. rake assets:precompile了又试了一次。
  4. 将有问题的项目添加到并重config.assets.precompile试。
  5. 将错误踢到路边,直到遇到另一个资产错误。
  6. 转到 3。

不知道如何解决这个问题,我转了几圈,直到我认为我得到了所有资产并且网站正在生产中渲染。然后我在 MSIE 中尝试了它并遇到了另一个错误 500:“belated_png_fix.js”被有条件地加载,直到那时它才出现。

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

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

4

4 回答 4

2

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

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

于 2012-12-10T23:57:12.847 回答
1

rails 3.1 也有类似的问题。您可以做的最好的事情是安装 capistrano 多阶段并获得一个登台服务器。

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

于 2011-09-09T19:34:07.057 回答
1

持续部署是一件很棒的事情,你应该达到它如此简单以至于实际上并没有那么痛苦的地步。话虽如此,config.assets.precompile可以采用正则表达式,那么您如何为顶级链轮“清单”文件制定标准,或者为不会捆绑的东西制定标准子文件夹?(请注意,我还没有真正尝试过这个......)

于 2011-09-15T04:54:00.203 回答
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

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

于 2011-09-15T04:42:06.173 回答