rake资产:预编译不起作用(rails 3.1.1)

时间:2011-10-21 06:08:34

标签: windows ruby-on-rails-3 heroku rake assets

我正在部署到heroku但我看到没有提供css文件(它们也无法在heroku上找到)。

我读到我需要做rake资产:首先在本地预编译然后当我这样做时,我得到:

C:\project>bundle exec rake assets:precompile --trace

** Invoke assets:precompile (first_time)
** Execute assets:precompile
rake aborted!
undefined: Unexpected token: operator (<)
  (in C:/project/app/assets/javascripts/application.js)

Tasks: TOP => assets:precompile
(See full trace by running task with --trace)

我在application.js中什么都没有,所以我不明白错误在哪里..

application.js是

// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery
//= require jquery_ujs
//= require_tree .

谢谢

更新

如果删除.js.erb文件,我会收到以下错误

C:\project>bundle exec rake assets:precompile RAILS_ENV=production --trace
** Invoke assets:precompile (first_time)
** Execute assets:precompile
rake aborted!
706: unexpected token at 'C:\Users\me\AppData\Local\Temp\execjs20111021-6448-ei2nm3.js(2, 3) Microsoft JScript runtime error: Out of memory

'
  (in C:/project/app/assets/javascripts/application.js)

Tasks: TOP => assets:precompile
(See full trace by running task with --trace)

仍然存在erb css和js文件未编译的问题......

这似乎没有结束.. 感谢

7 个答案:

答案 0 :(得分:5)

我一直在努力尝试部署到临时服务器。适合我的解决方案是确保在config/environments/[your_environment].rb文件中包含以下内容:

config.assets.compress = false

默认情况下,压缩器在生产以外的环境中不可用,这就是预编译失败的原因。

答案 1 :(得分:5)

我在这里有同样的问题!在我的情况下,导致此问题的原因是,我向javascript文件夹添加了一个新的JS文件,当我尝试运行预编译命令时出现undefined: Unexpected token: operator (<)错误。所以我查看了新的js文件,发现该文件中有一个HTML样式注释<!-- -->。我把它删除了,生活现在好了!

因此,请尝试找出js文件中是否存在任何HTML样式注释<!-- -->,然后删除这些注释。当从html文件中复制一些JS代码时尤其如此!

答案 2 :(得分:3)

我认为这是由外部javascript文件引起的,该文件没有良好的代码格式。例如

function say_hi(){
  // NOTICE that there's no semi-colon there!
  name = "Jim"
  alert("hi" + name )
}

在预编译下,你的代码会放入1行,因为没有必要的分号,你生成的js文件可能包含错误,比如

"undefined: Unexpected token: operator (<)" 

或其他什么。

所以,我的建议是:

  1. 如果js文件的代码格式不正确,请不要压缩js文件,方法是在配置文件中设置“config.assets.compress = false”,然后按@ Mike的回答。

  2. 尽可能使用coffeescript,它将帮助您生成格式良好的代码。 (我不是coffeescript大师,所以如果我错了请纠正我)

答案 3 :(得分:3)

我遇到了同样的问题,结果是因为包含了一个嵌入式javascript,其中包含以下格式的评论:<!-- comment -->我删除了它们,它就像一个魅力!希望这会有所帮助。

答案 4 :(得分:1)

我注意到的一件事应该是:

RAILS_ENV=production bundle exec rake assets:precompile

RAILS_ENV的定义需要在bundle命令之前,因为它为执行bundle命令的shell设置了shell(bash)环境变量。

您的问题似乎与此有关:

https://github.com/bradphelan/jasminerice/issues/21

另见:

http://guides.rubyonrails.org/asset_pipeline.html

Heroku rails 3.1 app - compiling assets locally vs compiling assets during slug compilation

Error compiling Rails 3 CSS asset on Heroku

答案 5 :(得分:1)

在遇到同样的错误后,我花了最后1个小时的时间挠头。问题是application.js中的以下行:

//= require_tree .

这会导致app/assets/javascripts/目录中的所有文件都被包含在内,可能是目录中另一个文件中存在某种错误。我删除了该行,并将我的资产编译为预编译(我实际上并没有使用application.js)。因此,请查找application.js

中包含的文件中的错误

答案 6 :(得分:0)

我遇到了类似的问题:

  

意外的令牌:运营商(&lt;&lt;&lt;)

这结果是Git中合并冲突的遗留文件。冲突会留下一个.orig文件,其中包含“&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; Git在哪里找到要合并的代码块。

由于资产管道指令

  

// = require_tree。

application.js 中的

,javascript文件夹中的所有文件(包括.orig文件)都会在推送到Heroku等服务器时进行预编译。预编译器发现“&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

所以我的解决方案是找到所有.orig文件并使用'git rm filename'方法从Git中删除它们。