3

我在部署期间使用 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在我的开发机器上运行,在生产机器上不起作用,在顶部给出错误。不知道如何调试这个。

4

3 回答 3

1

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

于 2013-05-10T17:44:10.617 回答
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

于 2013-05-07T20:13:27.870 回答
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"

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

于 2016-12-23T08:52:56.873 回答