在 Windows 上跟随 Ruby 教程时遇到 ExecJS::RuntimeError 问题

104

更新: Colin的建议删除了//= require_tree .这一行,问题已经解决。

我已经浪费了超过两天的时间尝试跟随每一个建议来修复我的问题。我正试图在Windows机器上按照http://ruby.railstutorial.org书籍进行操作,但是却无法摆脱以下可怕的错误。

ExecJS::RuntimeError in Static_pages#home

Showing C:/Users/.../bootcamp-sample-app/app/views/layouts/application.html.erb where line #6 raised:

["ok","(function() {\n\n\n\n}).call(this);\n"]
(in C:/Users/.../bootcamp-sample-app/app/assets/javascripts/sessions.js.coffee)
Extracted source (around line #6):

3: <head>
4:   <title><%= full_title(yield(:title)) %></title>
5:   <%= stylesheet_link_tag    "application", media: "all" %>
6:   <%= javascript_include_tag "application" %>
7:   <%= csrf_meta_tags %>
8:   <%= render 'layouts/shim' %>
9: </head>
Rails.root: C:/Users/.../bootcamp-sample-app

Application Trace | Framework Trace | Full Trace
app/views/layouts/application.html.erb:6:in `_app_views_layouts_application_html_erb___487732698_30422172'
Request

我尝试了所有建议,包括使用msi安装nodejs,使用execjs 1.3.0以及其他我甚至记不起来的东西。这是gem文件

source 'https://rubygems.org'

gem 'rails', '3.2.8'
gem 'bootstrap-sass', '2.0.0'
gem 'bcrypt-ruby', '3.0.1'
gem 'faker', '1.0.1'
gem 'will_paginate', '3.0.3'
gem 'bootstrap-will_paginate', '0.0.6'

group :development, :test do
  gem 'sqlite3', '1.3.5'
  gem 'rspec-rails', '2.10.0'
  gem 'guard-rspec', '0.5.5'
  gem 'guard-cucumber'
end

group :development do
  gem 'annotate', '2.5.0'
end


# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'coffee-script'
  gem 'uglifier'
end

gem 'jquery-rails', '2.0.2'

gem 'execjs'

# Gems on Linus/Mac
#gem 'therubyracer'


group :test do
  gem 'capybara', '1.1.2'
  gem 'guard-spork', '0.3.2'
  gem 'spork', '0.9.0'
  gem 'factory_girl_rails', '1.4.0'
  gem 'cucumber-rails', '1.2.1', require: false
  gem 'database_cleaner', '0.7.0'


# Test gems on Linux
#  gem 'rb-inotify', '0.8.8'
#  gem 'libnotify', '0.5.9'

# Test gems on Macintosh OS X
#  gem 'selenium-webdriver', '~> 2.22.0'
#  gem 'rb-fsevent', '0.9.1', :require => false
#  gem 'growl', '1.0.3'

# Test gems on Windows
# gem 'rb-fchange', '0.0.5'
# gem 'rb-notifu', '0.0.4'
# gem 'win32console', '1.3.0'
end

group :production do
#  gem 'therubyracer'
  gem 'pg', '0.12.2'
end

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# To use Jbuilder templates for JSON
# gem 'jbuilder'

# Use unicorn as the app server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
#gem 'debugger''

这里是 sessions.js.coffee 文件。

# Place all the behaviors and hooks related to the matching controller here.
# All this logic will automatically be available in application.js.
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/

application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
//= require_tree .
//= require bootstrap

application.html.erb

<!DOCTYPE html>
 <html>
 <head>
   <title><%= full_title(yield(:title)) %></title>
   <%= stylesheet_link_tag    "application", media: "all" %>
   <%= javascript_include_tag "application" %>
   <%= csrf_meta_tags %>
   <%= render 'layouts/shim' %>
 </head>
 <body>
 <%= render 'layouts/header' %>
 <div class="container">
   <%= yield %>
   <%= render 'layouts/footer' %>
 </div>
 </body>
 </html>

这里是控制台内容

Processing by StaticPagesController#home as HTML
  Rendered static_pages/home.html.erb within layouts/application (45.0ms)
Completed 500 Internal Server Error in 1136ms

ActionView::Template::Error (["ok","(function() {\n\n\n\n}).call(this);\n"]
  (in C:/Users/.../bootcamp-sample-app/app/assets/javascripts/sessions.js.coffee)):
    3: <head>
    4:   <title><%= full_title(yield(:title)) %></title>
    5:   <%= stylesheet_link_tag    "application", media: "all" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8:   <%= render 'layouts/shim' %>
    9: </head>
  app/views/layouts/application.html.erb:6:in `_app_views_layouts_application_html_erb___487732698_30422172'


  Rendered C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.0ms)
  Rendered C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.0ms)
  Rendered C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (34.0ms)

我已安装了Devkit,并尝试了各种gem,但请建议一些可以帮助我在Windows上开发的更改。我为所有东西使用rubyinstaller。

我缺少什么?


5
你可以尝试从 application.js 文件中删除 //= require_tree . 这行代码,然后查看错误是否仍然存在。 - Colin R
哇...太棒了...非常感谢Colin,删除//= require_tree .这一行已经解决了问题。我无法解释这是多么的宽慰,但您能否请解释一下为什么这一行会导致错误? - user1687078
3
这行代码在编译app/assets/javascripts目录下的所有.js.coffee文件,将其转换为JavaScript并添加到你的布局中(但仅在开发模式下;在生产模式下,编译后的JS会添加到application.js文件中)。require_tree .不应该导致错误,所以你可能有一个被包含的文件出现了问题。你能否列出app/assets/javascripts目录中所有的文件?此外,您可以尝试完全删除sessions.js.coffee的内容,然后再添加回//= require_tree .,看看错误是否仍然存在。 - Colin R
1
@ColinR,您应该将此添加为问题的答案。我遇到了同样的问题,如果我没有浏览评论,我会继续寻找另一个问题。 - Emmanuel F
13个回答

242

我的朋友在几个月前尝试在Win 8 RTM上完成Rails教程时遇到了这个错误。不确定这个问题是否也存在于Windows 7中,但这可能会有所帮助。

选项:

1)移除//= require_tree ./忽略此问题-如ColinR上面所述,这行代码本来不应该引起问题。您的系统上ExecJS与JavaScript运行时无法正常工作存在实际问题,而删除此行只是忽略这一事实。

2)安装Node.js/逃跑-许多人似乎最终都会安装Node.js并使用它代替其系统上已有的JavaScript运行时。虽然这是一个有效的选择,但它也需要额外的软件,并且只是避免了原始问题,即ExecJS无法与您系统上已有的JavaScript运行时正常工作。如果您的现有JavaScript运行时应该可以工作,那么为什么不让它工作而不是安装更多软件呢?根据ExecJS的创建者所说,Windows中已经内置的运行时实际上是受支持的...

ExecJS可让您从Ruby运行JavaScript代码。它自动选择可用于评估JavaScript程序的最佳运行时,然后将结果作为Ruby对象返回给您。

ExecJS支持以下运行时:

  • therubyracer - 嵌入在Ruby中的Google V8
  • therubyrhino - 在JRuby中嵌入的Mozilla Rhino
  • Node.js
  • Apple JavaScriptCore - 包含于Mac OS X中
  • Microsoft Windows Script Host(JScript)

(来自github.com/sstephenson/execjs#execjs)

3)实际修复问题/学习-使用选项1和2的知识搜索其他解决方案。在找到有关我们正在遇到的根本问题的信息之前,我关闭了多少网页,我无法告诉您。我们继续寻找的唯一原因是,我们无法相信Rails团队会(1)在每个脚手架生成的项目中插入一行代码,从而引发问题,或者(2)要求我们安装额外的软件只是为了运行该默认代码行。因此,我们最终找到了根本问题的解决方法(您的情况可能会有所不同)。

对我们起作用的修复方法: 在出现问题的系统上查找ExecJS的runtimes.rb文件。它看起来像。备份找到的文件的副本。打开原始的runtimes.rb进行编辑。找到以JScript = ExternalRuntime.new(开头的部分。在该部分中,在包含:command => "cscript //E:jscript //Nologo //U"的行上,仅删除//U。然后在包含:encoding => 'UTF-16LE' # CScript with //U returns UTF-16LE的行上,将UTF-16LE更改为UTF-8。保存更改到文件。现在,该文件的此部分应该如下所示:

JScript = ExternalRuntime.new(
    :name        => "JScript",
    :command     => "cscript //E:jscript //Nologo",
    :runner_path => ExecJS.root + "/support/jscript_runner.js",
    :encoding    => 'UTF-8' # CScript with //U returns UTF-16LE
)

接下来,停止并重新启动您的Rails服务器,并刷新在浏览器中生成原始错误的页面。希望现在页面可以顺利加载。这里是我们最初发布结果的ExecJS问题线程:https://github.com/sstephenson/execjs/issues/81#issuecomment-9892952

如果这不能解决问题,您可以随时使用您(希望)创建的备份副本覆盖已修改的runtimes.rb文件,这样一切都会回到原点。在这种情况下,请考虑选项3并继续搜索。请告诉我们最终为您解决了什么问题...除非是删除require_tree或安装node.js,否则已经有很多这样的解决方法了:)


20
我希望我能给你+50的投票。为了在Windows上使用therubyracer,我已经苦苦挣扎了很长一段时间,发现它不受支持,然后又试图使ExecJS正确加载。感谢你花时间帮助我学习,而不是混淆问题!对于那些想知道的人,您可以通过键入"gem which execjs"来获取runtimes.rb文件的位置。 - Michael
4
我必须在做出这个更改后运行bundle install,以使它正常工作。因此,如果有人尝试了这个解决方案,但一开始似乎并没有起作用,请确保你尝试运行bundle install! 我使用的是64位Windows 8系统,这个方法对我有效!谢谢! - Peter Kirby
10
有人在GitHub上的问题页面(https://github.com/sstephenson/execjs/issues/111)中评论选项3:只需将“UTF-16LE”更改为“UTF-16”即可解决问题,无需删除“//U”选项。我确认了这一点。 - Tsutomu
3
我看到了很多“怎么”,但是没有太多的“为什么”。为什么在Windows上改变看起来像字符集的东西会产生影响呢?我只是很好奇。 - NathanTempelman
2
对于那些不知道如何找到 runtimes.rb 的人,它在这里: ...\RUBYINSTALLATIONFOLDER\lib\ruby\gems\2.2.0\gems\execjs-2.6.0\lib\execjs例如:C:\Ruby22-x64\lib\ruby\gems\2.2.0\gems\execjs-2.6.0\lib\execjs - Chad Mx
显示剩余13条评论

14

遇到了同样的问题 操作系统- Windows 8 错误信息- 'ExecJS::RuntimeError...' 解决方案- 缺少 Node.js

  1. http://www.nodejs.org/download/下载并安装Node.js
  2. 重新启动计算机

1
这个对我有用。这里有人知道为什么安装node.js可以解决吗? - mpalencia

12

我遇到了这个问题并在网上搜索。我的电脑运行着Windows 8,并带有这个Rails gem文件。

source 'https://rubygems.org'

gem 'rails', '3.2.9'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

group :development do gem 'sqlite3', '1.3.5' 
end

# Gems used only for assets and not required # in production environments by default. 

group :assets do 
    gem 'sass-rails', '3.2.5' 
    gem 'coffee-rails', '3.2.2'

gem 'uglifier', '1.2.3' 
end

gem 'jquery-rails', '2.0.2'

group :production do 
    gem 'pg', '0.12.2' 
end

去了http://nodejs.org/download/,安装完毕后重启电脑,一切正常。


我按照建议安装了Node,不需要重新启动,只需打开一个新的cmd窗口(猜测这样可以访问新路径)。 - Will

5
我选择了“学习”路线。问题似乎源于:
IO.popen(command, options) { |f| output = f.read }

execjs\external_runtine.rb的第173行返回空字符串,因此错误信息中没有文本。建议的更改对我无效。我将UTF-16LE更改为UTF-8,但它仍然返回空字符串。我从command中删除了\\U——这至少返回了文本,但编码不正确,在浏览器中显示为中文字符。
根据这篇MSDN博客文章,使用//U标志并重定向到文件会导致cscript使用UTF-16返回结果。
然后,通过将command设置为"cscript //E:jscript //Nologo"和将encoding设置为"UTF-8",奇迹般地解决了问题(@#%$&^@$%!!!?!?!)。

4

我知道这对于这个问题来说是一个非常晚的答案,但我遇到了类似的情况,并走了一条完整的路径来了解到底是什么导致了这个问题。

事实证明,Windows默认的jscript引擎仍然使用es3,而许多gems正在利用es5或es6功能。不幸的是,如果发生这种情况(您正在使用利用es5或es6功能的gem或代码),则无法让其在具有本地js引擎的Windows上工作。

这就是安装node.js解决问题的原因(node至少是es5)。

希望这可以帮助一些人解决jsexec的运行时错误。

我的建议是安装node(非常简单)或安装v8,而不是删除//=require_tree。

请注意,如果检测到,execjs将自动使用node。否则,强制使用它,在boot中添加类似以下内容:

ENV['EXECJS_RUNTIME'] = 'Node'

设置环境为node。


安装Node是个好主意(也可能是最简单的方法),但考虑到它的大小,仍然有点过度。 - prusswan

4
我必须将我的nodejs文件夹添加到Windows路径环境变量中。在Windows 8中打开控制面板,进入系统,高级系统设置(在左侧),点击左侧的环境变量,并编辑Path变量以包括指向您的nodejs文件夹的目录(可能在Program Files中)。
当然,您必须已安装Node.js(使用Windows安装程序),并通过NPM安装了CoffeeScript。

4
对于Windows用户,这可能有效。在Windows上运行coffee-script-source >1.9.0存在问题。
看起来你必须将以下内容添加到你的gemfile中:
gem 'coffee-script-source', '1.8.0'
然后执行
bundle update coffee-script-source 我尝试了以上所有选项,还混合了一些组合,直到我发现了这个Rails-4, ExecJS::ProgramError in Pages#welcome,并进行了多个系统gem更新和bundle安装和更新。
我撤销了所有的尝试并降级了我的coffee-script-source,它成功了。在这里发布以帮助任何其他可能遇到类似问题的人。
更新vendor/cache中的文件
coffee-script-source-1.8.0.gem 从vendor/cache中删除过时的.gem文件 coffee-script-source-1.9.1.1.gem Bundle已更新!

我尝试了被接受的答案的第3个选项,然后出现了“参数错误”,尝试安装nodejs,但没有帮助,将nodejs添加到路径变量中(我在Win10上),最后尝试了您的方法。成功了!谢谢 - elk

3

对于像我这样的初学者:

  1. 导航到\app\views\layouts\application.html.erb
  2. 将第6行更改为:

    '<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>'

改为:

<%= javascript_include_tag 'defaults', 'data-turbolinks-track' => true %>

点击此处获取修复方法的教程来源


只有当我输入以下两行代码时,我的矿才能正常工作:<%= stylesheet_link_tag 'defaults', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'defaults', 'data-turbolinks-track': 'reload' %> 感谢Leandro P. - rld
1
请不要这样做。这将会移除你的Rails应用中所有的Javascript。这样做虽然可以隐藏问题,但是以后会引起其他问题。 - mattangriffel
是的,正如@mattangriffel所说,不要这样做。 - Neil Atkinson

2

快速而简单的解决方案:从application.js中删除//= require_tree .

正如我在问题的评论中解释的那样,这并没有真正解决导致错误的根本问题,只是绕过了它。


你好 Colin R,我需要帮助。如果错误发生在第5行,只需删除 <%= stylesheet_link_tag 'application',media:'all','data-turbolinks-track'=> true %> 这行代码即可解决问题。但是Bootstrap没有应用到网页上。即使从application.css.sass中删除 *= require_tree . 也不起作用。我的朋友的系统是Windows 7 32位,未安装nodejs。即使您建议的第3种方法也无效。我认为在我的情况下JS没有问题。有什么想法可以防止错误吗? - learner
我也安装了Node.js,并将npm的路径设置在环境变量中。但仍然出现相同的错误。我正在Windows 8.1 64位操作系统上开发应用程序,使用相同的gems。 - learner

2
我使用了方案2,因为之前我犯过这个错误,但这次不起作用,然后我添加了 gem'coffee-script-source','1.8.0' 并运行
bundle install

我的问题已经解决了


如果您使用的是解决方案2,则必须在安装Node.js后重新加载所有命令行窗口。然后打开服务器并再次尝试。 - Yuliem Alavez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接