ExecJS咖啡脚本没有显示编译错误的行号(Rails资产管道)

在我的一个Rails应用程序中,ExecJS没有显示coffeescript编译错误的行号。 我的编译错误消息将如下所示:

ExecJS::RuntimeError in Referrals#new Showing ~/MyApp/app/views/layouts/application.html.erb where line #6 raised: SyntaxError: unexpected IDENTIFIER (in ~/MyApp/assets/javascripts/utils.js.coffee) 

请注意,咖啡脚本源没有行号(第6行用于erb文件)。

在我的另一个应用程序中,我仍然在获取行号,语法错误如下所示:

 ExecJS::ProgramError in Projects#show Showing ~/OtherApp/app/views/layouts/application.html.erb where line #17 raised: Error: Parse error on line 6: Unexpected 'STRING' (in ~/OtherApp/app/assets/javascripts/projects.js.coffee) 

所以似乎区别在于ExecJS::ProgramError会给我行号,而ExecJS::RuntimeError则不行。

任何人都知道如何获得行号? 为什么我的应用程序在咖啡资产编译上创建RuntimeErrors,而另一个是给出ProgramErrors? 我检查过Rails,它们似乎匹配。

请注意,如果我修复编译错误,应用程序运行正常(例如,咖啡文件实际上已经编译) – 但是让这些行号指向编译错误是很好的!

编辑我意识到,无论是ExecJS Runtimeerror还是ProgramError似乎并不重要 – 在第一个应用程序中,从来没有给Runtimeerror号,而在第二个应用程序中,始终存在。

我想通了 – 这是由于coffee-script-source gem版本。 在给出行号的应用程序中, bundle show给出了1.4.0的coffee-script-source,而另一个应用程序有一个1.6.1的coffee-script-source版本。

我没有注意到这一点,因为coffee-rails gem没有严格指定这种依赖性(在我的Gemfiles中,我使用的是gem’coffee gem 'coffee-rails', '3.2' )。 要解决这个问题,只需明确指定coffee-script-source gem版本

 gem 'coffee-rails', '3.2.2' gem 'coffee-script-source', '1.5.0' 

bundle update coffee-script-source

希望这可以帮助任何可能遇到这种差异的人。

这也可以通过此修补程序修复, 该修补程序将行信息嵌入到ruby-coffee-script gem 的错误消息中。

如果你正在使用源地图, 这个补丁修复了coffee-rails-source-maps gem。