部署期间预编译资产失败

时间:2013-05-07 16:23:34

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

我正在使用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的回答确实对我有所帮助,但仍然有问题。在部署期间,它只是在预编译失败而没有给我信息。所以我做了Tom提到的,我在我的开发机器上预编译,但是在生产环境中,并注意到我也遇到了问题。

它给我的错误是“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,在生产机器上不起作用,在顶部给出错误。不知道如何调试这个。

3 个答案:

答案 0 :(得分:1)

如果要从中导入其他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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我还希望使用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"

作为奖励,这加快了资产编制的数量级。