ExecJS :: RuntimeError no Windows tentando seguir rubytutorial

103

ATUALIZAÇÃO: sugestão de Colin de remover a linha // = require_tree. corrigiu o problema.

Eu perdi mais de 2 dias tentando seguir todas as sugestões lá fora e corrigir meu problema. Estou tentando seguir o livro http://ruby.railstutorial.org em uma máquina com Windows e não consigo superar o seguinte erro desagradável.

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

Eu tentei todas as sugestões, incluindo a instalação do nodejs com o msi, usando execjs 1.3.0 e outras coisas que eu nem consigo me lembrar mais. Aqui está o arquivo 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''

e aqui está o 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>

Aqui está o conteúdo do console

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)

Eu instalei o Devkit e tentei várias joias, mas por favor sugira mudanças que podem me ajudar a desenvolver no Windows. Usei o rubyinstaller para tudo.

o que estou perdendo?

user1687078
fonte
5
Você poderia tentar remover a linha //= require_tree .de application.jse ver se o erro persiste?
Colin R de
WOW .... isso fez o truque ... muito obrigado Colin, removendo a linha // = require_tree. corrigiu o problema. Não posso explicar o que é um alívio, mas posso explicar por que essa linha está causando o erro?
user1687078
3
Essa linha compila cada .js.coffeearquivo em app/assets/javascriptsJavaScript e, em seguida, adiciona-o ao seu layout (mas apenas no modo de desenvolvimento; no modo de produção, o js compilado é adicionado ao seu application.jsarquivo). Ter require_tree .não deveria estar causando erros, então de alguma forma você tem um problema com um dos arquivos que estão sendo incluídos. Você pode postar uma lista de todos os arquivos em seu app/assets/javascriptsdiretório? Além disso, você pode tentar excluir completamente o conteúdo sessions.js.coffeee adicionar novamente //= require_tree .e ver se o erro ainda existe.
Colin R de
1
@ColinR, você deve adicionar isso como uma resposta à pergunta. Tive o mesmo problema e, se não tivesse navegado nos comentários, teria continuado a procurar outra questão.
Emmanuel F

Respostas:

242

Meu amigo estava tentando um tutorial Rails no Win 8 RTM alguns meses atrás e encontrou este erro. Não tenho certeza se esse problema também existe no Windows 7, mas isso pode ajudar.

Opções:

1) Removendo //= require_tree ./ Ignorando o problema - Como ColinR afirmou acima, esta linha não deveria estar causando um problema em primeiro lugar. Há um problema real com o ExecJS funcionando corretamente com o tempo de execução do JavaScript em seu sistema e remover essa linha é simplesmente ignorar esse fato.

2) Instalando o Node.js / Fugindo - Muitas pessoas parecem simplesmente instalar o Node.js e usá-lo em vez do tempo de execução do JavaScript já existente no sistema. Embora seja uma opção válida, também requer software adicional e apenas evita o problema original, que é o ExecJS não estar funcionando corretamente com o tempo de execução do JavaScript já em seu sistema. Se o tempo de execução do JavaScript existente em seu sistema deve funcionar, por que não fazê-lo funcionar em vez de instalar mais software? De acordo com o criador do ExecJS, o tempo de execução já embutido no Windows é de fato suportado ...

ExecJS permite que você execute código JavaScript a partir de Ruby. Ele escolhe automaticamente o melhor tempo de execução disponível para avaliar seu programa JavaScript e, a seguir, retorna o resultado para você como um objeto Ruby.

ExecJS oferece suporte a estes tempos de execução:

  • therubyracer - Google V8 incorporado em Ruby
  • therubyrhino - Mozilla Rhino incorporado no JRuby
  • Node.js
  • Apple JavaScriptCore - Incluído no Mac OS X
  • Microsoft Windows Script Host (JScript)

(de github.com/sstephenson/execjs#execjs)

3) Corrigindo efetivamente o problema / Aprendizagem - Use o conhecimento das opções 1 e 2 para pesquisar outras soluções. Não posso dizer quantas páginas da web fechei ao ver as opções 1 ou 2 eram a solução aceita antes de realmente encontrar informações sobre o problema raiz que estávamos tendo. A única razão pela qual continuamos procurando foi que não podíamos acreditar que a equipe Rails iria (1) inserir uma linha de código em cada projeto gerado por scaffold que causou um problema, ou (2) exigir que instalemos software adicional apenas para executar aquele padrão linha de código. E assim finalmente chegamos a uma solução para nosso problema raiz (suas milhas podem variar).

A correção que funcionou para nós: no sistema com problemas, localize o arquivo runtimes.rb do ExecJS . Parece que este . Faça uma cópia do arquivo encontrado para backup. Abra o runtimes.rb original para edição. Encontre a seção que começa com a linha JScript = ExternalRuntime.new(. Nessa seção, na linha que contém :command => "cscript //E:jscript //Nologo //U",- remova o //Uúnico. Em seguida, na linha que contém :encoding => 'UTF-16LE' # CScript with //U returns UTF-16LE- altere UTF-16LE para UTF-8. Salve as alterações no arquivo. Esta seção do arquivo agora deve ser:

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
)

Em seguida, pare e reinicie seu servidor Rails e atualize a página em seu navegador que produziu o erro original. Esperançosamente, a página carrega sem erros agora. Aqui está o tópico de problemas do ExecJS em que postamos nossos resultados originalmente: https://github.com/sstephenson/execjs/issues/81#issuecomment-9892952

Se isso não resolver o problema, você sempre pode sobrescrever o runtimes.rb modificado com a cópia de backup que você (espero) fez e tudo voltará à estaca zero. Nesse caso, considere a opção 3 e continue pesquisando. Deixe-nos saber o que eventualmente funciona para você .. a menos que seja removendo o require_tree ou instalando node.js, há muito disso já acontecendo. :)

Kevin P
fonte
20
Eu gostaria de poder dar a você +50 votos. Isso tem me irritado por muito tempo tentando fazer o therubyracer funcionar para o Windows, percebendo que não é compatível, e tentando fazer o ExecJS carregar corretamente. Obrigado por dedicar seu tempo para me ajudar a aprender e não ofuscar o problema! Para aqueles que estão se perguntando, você pode obter a localização do arquivo runtimes.rb digitando "gem which execjs"
Michael,
4
Tive que executar o bundle install depois de fazer essa alteração para que funcionasse. Portanto, se alguém tentar essa solução e ela não funcionar a princípio, certifique-se de tentar! Estou no Windows 8 de 64 bits e funcionou para mim! Obrigado
Peter Kirby,
2
+1 salvou a agitação de instalar o nó. A opção 3 funciona para mim no Windows 8 de 64 bits
Sami
10
Comentário sobre a opção 3: github.com/sstephenson/execjs/issues/111 diz que podemos resolver o problema apenas mudando UTF-16LEpara UTF-16sem remover a //Uopção. Eu confirmei.
Tsutomu
3
Estou vendo muito como, mas não muito por quê. Por que alterar o que parece um conjunto de caracteres faz diferença apenas no Windows? Estou curioso, só isso.
NathanTempelman
14

Tive o mesmo problema de SO- Erro do Windows 8- 'ExecJS :: RuntimeError ...' Solução- Node.js ausente

  1. instale o Node.js em http://www.nodejs.org/download/
  2. Reinicie o computador
snassr
fonte
1
este funcionou para mim. Alguém aqui sabe por que a instalação do node.js funcionou?
mpalencia 01 de
12

Eu tive esse problema e estava vasculhando a internet Estou executando o Windows 8 com este arquivo 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

Fui para http://nodejs.org/download/ instalado - reiniciei a máquina e tudo funcionou.

gustavoanalytics
fonte
Instalei o nó como sugerido, não precisei reiniciar, apenas abrir uma nova janela cmd (acho que é para que os novos caminhos possam ser acessados)
Será
5

Eu favoreci a rota de aprendizagem . Parece que o problema vem de

IO.popen(command, options) { |f| output = f.read }

retornando uma string vazia execjs\external_runtine.rb(linha 173 na versão 1.4.0). É por isso que a mensagem de erro não contém texto. As mudanças sugeridas não funcionaram para mim. Mudei UTF-16LEpara UTF-8, mas ainda retornou uma string vazia. I removido \\Udo command- este texto, pelo menos, voltou, mas foi na codificação errada - no navegador que exibidos como caracteres chineses.

De acordo com esta postagem no blog do MSDN , usar o //Usinalizador e redirecionar para um arquivo faz cscriptcom que o resultado seja retornado usando UTF-16.

E então, magicamente, funcionou ( @ #% $ & ^ @ $% !!!?!?!) Usando commandcomo "cscript //E:jscript //Nologo"e encodingcomo "UTF-8". Ah bem.

cofiem
fonte
4

Tive que adicionar minha pasta nodejs à minha variável de ambiente Windows Path. No Windows 8, abra o Painel de Controle, vá para Sistema, Configurações avançadas do sistema (à esquerda), clique em Variáveis ​​de Ambiente à esquerda e edite a variável de caminho para incluir o diretório em sua pasta nodejs (provavelmente em Arquivos de Programas).

Claro que você precisa ter o Node.js instalado (use o instalador do Windows ) e o CoffeeScript instalado através do NPM.

Evan
fonte
4

Sei que essa é uma resposta muito tardia para esse problema, mas descobri algo semelhante e percorri todo o caminho para entender o que realmente estava causando o problema.

Descobriu-se que o mecanismo jscript padrão do Windows ainda está no es3, e muitos gems estão aproveitando os recursos do es5 ou es6. Infelizmente, se isso acontecer (você está usando uma gema ou um pedaço de código que aproveita os recursos do es5 ou es6), não há como deixá-lo funcionar no Windows com o mecanismo nativo js.

Esta é a razão pela qual a instalação do node.js resolve o problema (o node é pelo menos es5).

Espero que isso possa ajudar algumas pessoas que estão lutando com um erro de execução do jsexec.

Meu conselho de 2 centavos é instalar o node (muito fácil) ou instalar o v8, e não remover o // = require_tree.

Observe que os execjs usarão automaticamente o nó se detectado. Caso contrário, force seu uso, adicionando na inicialização algo como:

ENV['EXECJS_RUNTIME'] = 'Node'

Para definir o env para o nó.

Dinuz
fonte
instalar o nó é uma boa ideia (e provavelmente a mais simples), mas ainda é um pouco exagerado considerando seu tamanho
prusswan
4

Para usuários do Windows, isso pode funcionar. Há um problema com o coffee-script-source> 1.9.0 em execução no Windows.

Parece que você tem que adicionar isso ao seu gemfile:

gem 'coffee-script-source', '1.8.0'

então faça

pacote de atualização de café-script-fonte

Eu tentei todas as opções acima, e também misturei algumas combinações delas, até que encontrei este Rails-4, ExecJS :: ProgramError em Pages # welcome e fiz várias atualizações de gem do sistema e pacotes de instalações e atualizações.

Eu reverti todos os meus testes e rebaixei minha fonte de script de café e funciona. Postando aqui para ajudar qualquer pessoa que possa ter um problema semelhante.

Atualizando arquivos no fornecedor / cache

coffee-script-source-1.8.0.gem Removendo arquivos .gem desatualizados do vendor / cache coffee-script-source-1.9.1.1.gem Pacote atualizado!

DJSampat
fonte
Tentei a opção 3 da resposta aceita, em seguida, obtive um "Erro de argumento", tentei instalar o nodejs, não ajudou, adicionei nodejs às variáveis ​​de caminho (estou no Win10) e finalmente tentei sua abordagem. Funcionou! Obrigado
elk
3

Para iniciantes como eu:

  1. Navegue até \ app \ views \ layouts \ application.html.erb
  2. Altere a linha 6 de:

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

para

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

Fonte do tutorial para corrigir aqui

Leandro P.
fonte
A mina só funciona quando coloco as duas linhas: <%= stylesheet_link_tag 'defaults', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'defaults', 'data-turbolinks-track': 'reload' %> obrigado Leandro P.
rld
1
Por favor, não faça isso. Isso apenas removerá todo o Javascript do seu aplicativo Rails. Isso oculta o problema, mas causará outros mais tarde.
mattangriffel
Sim, como diz @mattangriffel, não faça isso.
Neil Atkinson
2

Solução rápida e suja: remover //= require_tree .deapplication.js .

Conforme explico nos comentários para a pergunta, isso não resolve realmente o problema subjacente que está causando o erro, mas apenas o contorna.

Colin R
fonte
Olá Colin R, preciso de ajuda. E se o erro ocorrer na linha 5, onde apenas remover <% = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true%> esta linha de código corrigiu o problema. Mas o bootstrap não se aplica à página da web. Mesmo removendo * = require_tree. de application.css.sass não está funcionando. O sistema do meu amigo tem Windows 7 de 32 bits, nodejs não instalado. Mesmo o método 3 sugerido por você não está funcionando. Acho que não há problema com js no meu caso. Alguma ideia de como evitar o erro?
aluno de
Também instalei o Node.js e o caminho do npm é definido nas variáveis ​​de ambiente. Ainda é o mesmo erro. Estou desenvolvendo o aplicativo no sistema operacional Windows 8.1 de 64 bits e as mesmas joias são usadas.
aluno de
2

Usei a solução número 2 porque anteriormente tinha esse erro, mas nesta ocação não funcionou, então adicionei o

gem 'coffee-script-source', '1.8.0'

e corra

bundle install

e meu problema foi resolvido

Yuliem Alavez
fonte
Se você usou a solução número 2, deve recarregar todas as linhas de comando nas janelas após instalar o Node.js. Em seguida, ligue o servidor e tente novamente.
Yuliem Alavez
1

Aqui está uma solução menos complicada, para iniciantes:

Se você está apenas trabalhando no tutorial, provavelmente está trabalhando com o Gemfile padrão (ou quase). Você pode abri-lo em seu editor de texto e remover o sinal de sustenido do início desta linha:

# gem 'therubyracer', :platforms => :ruby

Você precisará executar novamente bundle install , o que provavelmente fará o download de algumas coisas. Mas, uma vez que isso aconteça, você poderá iniciar o servidor sem nenhum problema.

Pelo menos, isso funcionou para mim.

A propósito, isso também funciona no Ubuntu 12.04.

Karl Giesing
fonte
0

Executando Win 8 64 bit rails 4.2.5 ruby ​​2.1.7

Este funcionou para mim

Sumit Kumar
fonte
0

Você alterou a localização do seu código de C: \ Users \ this-user \ yo-app ?

Quando eu era jovem no Rails, criei um aplicativo e o local padrão do meu aplicativo era C: \ Users \ Duncan \ my-app e então, quando mudei meu-aplicativo e coloquei em D: \ All-my-Apps -pasta eu tive esse erro ....

Eu cocei minha cabeça, tentei 1,2,3 e mais ... nada! Até retornar todo o código ao local da pasta padrão e, para minha surpresa, estava rolando novamente :)

Caso alguém possa achar isso útil (não posso explicar por que isso aconteceu, talvez alguém possa sem especulação)

Dancun Chiriga
fonte