【问题标题】:Precompiling Assets Failure During Deployment部署期间预编译资产失败
【发布时间】:2013-05-07 16:23:33
【问题描述】:

我在部署期间使用 Capistrano 预编译我的资产,但我遇到了一个对我来说不是很有用的错误。

* executing "cd -- path/to/releases/20130507161214 && bundle exec rake RAILS_ENV=production RAILS_GROUPS=assets assets:precompile"

*** rake aborted!
*** wrong argument type nil (expected Data)
*** (in /path/to/app/assets/javascripts/application.js)
*** /path/to/gems/therubyracer-0.11.4/lib/v8/context.rb:67: in 'New'

这是我的application.js,被推荐:

//= require jquery
//= require jquery_ujs
//= require bootstrap

更新

所以我尝试完全删除application.js 并再次运行它,但随后它抱怨我的另一个js 文件(但同样的无用错误)。然后我删除了我所有的js 文件,它开始抱怨我的css 文件。

如果所有 js 和 css 文件都被删除,预编译确实成功(但显然没有我需要的 js 和 css 文件)。

我将.js.coffee.css.scss 用于我的所有非图像资产。

更新

@TomDavies 的回答确实对我有所帮助,但仍然存在问题。在部署期间,它只是在预编译时失败并且没有给我信息。所以我做了汤姆提到的,我在我的开发机器上预编译,但在生产环境中,发现我也有问题。

它给我的错误是“Unexpected INDENT”,但它不会告诉我行号,只是一个文件名......

我最终发现我的 ajax 请求中缺少逗号。显然它在开发环境中没有它就可以工作,只是没有它就无法预编译......

这是我的:

$.ajax 'some/url'
  success:
    alert 'yay!'

这是我需要的:

$.ajax 'some/url',
  success:
    alert 'yay!'

注意顶行末尾的逗号...现在预编译在开发中非常有用。我确信在开发机器(但生产环境)上修复预编译期间的错误将解决部署问题,但无济于事。它仍然失败,顶部 wrong argument type nil (expected Data) 出现相同的错误。

tl;博士

我能够在我的开发机器上运行rake assets:precompile RAILS_ENV=production,在生产机器上不起作用,在顶部给出错误。不知道如何调试这个。

【问题讨论】:

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


    【解决方案1】:

    这看起来像是一个可能的 gem 问题,因为它在 application.js 文件上失败并且您的内容看起来正确。您正在使用哪个版本的 Ruby?如果您切换了不同的版本,您可能需要清除 gems 目录并从头开始重新安装它们。我遇到了在一个 Ruby 版本下安装的 gem 的问题,留下的素材会导致在另一个版本下发生奇怪的事情。

    【讨论】:

    • 哇...我一直在努力解决这个问题。我确实从 Ruby 2.0 开始,最终降级到 1.9.3。我想我没有在我的问题中提到这一点。清除宝石并从头开始重新部署后,问题解决了!
    【解决方案2】:

    如果您想从中导入其他 scss,您的文件应命名为 application.scss。

    我不确定您的确切错误,但对于资产管道问题,您应该始终尝试在开发中本地编译它们。这样,错误通常会更加明显,您可以更轻松地试错。以下是我通常在 config/environments/development.rb 中保留的一些步骤,用于让资产预编译在本地工作:

      # NOTE: To test asset pipeline in dev uncomment the following configs and run:
      #
      # $ RAILS_ENV=development rake assets:precompile
      #
      # It is recommended you rm -rf public/assets when you are finished or this may affect
      # your local dev environment
      #
      # config.assets.compress = true
      # config.assets.compile = false
      # config.assets.digest = true
    

    这里有一个相同的要点:

    https://gist.github.com/atomgiant/5438672

    【讨论】:

    • 感谢您的回复,现在将尝试一些。
    • 嗯,将application.css 重命名为application.scss 确实允许它在本地开发中运行,但在生产模式下部署期间仍然无法运行。我想我应该在每次部署之前在本地预编译...
    • 我强烈建议不要这样做。您的应用也将开始在开发模式下引用已编译的资产。
    • @PuneetGoyal - dev 中的预编译应该只是调查预编译问题的临时设置。我想我可以更清楚地说明这一点。这就是为什么我还建议在完成后删除预编译的资产,否则它会干扰您的本地开发环境。
    • 对,我认为这是出于调查目的。我已经用更多信息更新了我的问题。我以为这已经解决了,但我错了。
    【解决方案3】:

    我还希望使用 Node.js 作为 ExecJS 运行时。 TheRubyRacer 和内存管理 (https://github.com/cowboyd/therubyracer/issues/350) 有几个记录在案的问题,似乎该项目已被放弃 (https://github.com/cowboyd/therubyracer/pull/348)。

    假设您安装了最新的 Node.js,您可以将 EXECJS_RUNTIME="Node" 添加到预编译任务中:

    rake assets:precompile RAILS_ENV=production EXECJS_RUNTIME="Node"

    作为奖励,这将资产编译速度提高了一个数量级。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2022-01-26
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多