Problem deploying Rails 3.1 project to Heroku: Could not find a JavaScript runtime

20,271

Solution 1

You need a JavaScript engine for Rails 3.1 (heroku doesn’t have one), and it appears that the JavaScript engine that works with Heroku is the rubyracer for heroku.

Rails uses execjs to execute JavaScript and execjs supports 7 JavaScript engines. Node.js is one, and rubyracer is one.

Gerred Dillon had a similar problem and wrote about it. In the comment section a point was raised about making this a production only change, since you already have nodejs as your local JavaScript engine. So the relevant code is:

group :production do
  gem 'therubyracer-heroku', '0.8.1.pre3'
end

UPDATE: Heroku has a new stack, called Cedar, that they recommend for Rails 3.1.0. (Run heroku stack to see what stack your app is on.) Heroku also has a doc about upgrading to Rails 3.1.0 rc5. They recommend not using the ‘therubyracer-heroku’ gem anymore as it’s not necessary with rc5.

If you are upgrading from an older rc, make sure to update your config/application.rb file, and also run this command:

heroku config:add PATH=vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin:bin

Apparently, this is set in new apps, but existing apps have not set this PATH.

Solution 2

You don't necessarily need a JavaScript runtime to deploy Rails 3.1 beta to heroku.

The JavaScript runtime is only required if you are minifying javascript on deployment (i.e., via the uglifier gem) or if you are using coffee-script.

It looks like this javascript runtime dependency will not be there for the 3.1 final release.

In case you don't mind not minifying your javascript (and also if you're not using coffee-script), then you can comment out the coffee-script, uglifier and execjs gems in the Gemfile and also comment out config.assets.js_compressor in your production.rb and you should be good to go.

Solution 3

As of the date of this post you still need to specify

gem 'therubyracer-heroku', '0.8.1.pre3'

in your gemfile in order to successfully deploy a Rails 3.1 app to Heroku's Cedar platform.

While it is possible to deploy Node apps to the Cedar platform, Node itself is not present on the Cedar stack when deploying Rails apps, so you have to bundle your own javascript runtime.

For now.

I know the people on the Rails side of things are working to remove the dependency on having a js runtime, http://yehudakatz.com/2011/06/14/what-the-hell-is-happening-to-rails/ and I'm sure that Heroku is also looking into ways to make Rails 3.1 deployments just work.

Solution 4

In my case, it happened after successful upload to Heroku and accessing the page.

ActionView::Template::Error (Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.
2012-01-09T08:21:19+00:00 app[web.1]:   (in /app/app/assets/javascripts/page.js.coffee)):

Setting path using 'heroku config:add PATH blah' didn't help.

"rake assets:precompile" just solved it.

Hope it helps anyone like me!

Share:
20,271
WYi
Author by

WYi

Updated on June 15, 2020

Comments

  • WYi
    WYi almost 4 years

    I am having trouble deploying a rails 3.1 beta project to heroku. The problem happened at the database migration step. When I ran:

    heroku rake db:migrate
    

    I got error message:

    > rake aborted! 
    
    > Could not find a JavaScript runtime. See
    > https://github.com/sstephenson/execjs
    > for a list of available runtimes.
    
    > /app/Rakefile:5 
    
    > (See full trace by running task with --trace) 
    
    > (in /app)
    

    But I can successfully run the application locally, and I do have nodejs installed. Any idea why?

    Here my gem list:

    abstract (1.0.0)
    actionmailer (3.1.0.beta1)
    actionpack (3.1.0.beta1, 3.0.7)
    activemodel (3.1.0.beta1, 3.0.7)
    activerecord (3.1.0.beta1)
    activeresource (3.1.0.beta1)
    activesupport (3.1.0.beta1, 3.0.7)
    ansi (1.2.5)
    arel (2.1.0)
    bcrypt-ruby (2.1.4)
    builder (3.0.0, 2.1.2)
    bundler (1.0.13)
    coffee-script (2.2.0)
    coffee-script-source (1.1.0)
    configuration (1.2.0)
    daemon_controller (0.2.6)
    erubis (2.7.0, 2.6.6)
    execjs (1.0.0, 0.3.3)
    fastthread (1.0.7)
    heroku (2.1.4)
    hike (1.0.0)
    i18n (0.6.0beta1, 0.5.0)
    jquery-rails (1.0.1)
    json (1.5.1)
    json_pure (1.5.1)
    launchy (0.4.0)
    mail (2.3.0)
    mime-types (1.16)
    minitest (1.6.0)
    multi_json (1.0.1)
    mysql (2.8.1)
    mysql2 (0.3.2)
    oauth (0.4.4)
    passenger (3.0.7)
    polyglot (0.3.1)
    rack (1.3.0.beta, 1.2.2)
    rack-cache (1.0.1)
    rack-mount (0.7.2, 0.6.14)
    rack-ssl (1.3.2)
    rack-test (0.6.0, 0.5.7)
    rails (3.1.0.beta1)
    railties (3.1.0.beta1)
    rake (0.8.7)
    rdoc (2.5.8)
    rest-client (1.6.1)
    rubygems-update (1.8.1)
    sass (3.1.1)
    simplegeo (0.5.1)
    sprockets (2.0.0.beta.2)
    sqlite3 (1.3.3)
    sqlite3-ruby (1.3.3)
    term-ansicolor (1.0.5)
    therubyracer-heroku (0.8.1.pre3)
    thor (0.14.6)
    tilt (1.3)
    treetop (1.4.9)
    turn (0.8.2)
    tzinfo (0.3.27)
    uglifier (0.5.1)
    
  • providence
    providence almost 13 years
    I have just attempted this, but the file fails to install on heroku. A google of the issue shows lots of similar issues.
  • providence
    providence almost 13 years
    also, it may be necessary to update line 3 in config/initializers/session_store.rb to something like MyApp::Application.config.session_store :cookie_store, :key => '_blahblahblah_session'
  • WYi
    WYi almost 13 years
    I do have this gem installed and used in Gemfile. # Asset template engines gem 'sass' gem 'coffee-script' gem 'uglifier' gem 'jquery-rails' gem 'therubyracer-heroku', '0.8.1.pre3', :platforms => :ruby # Use unicorn as the web server # gem 'unicorn' # Deploy with Capistrano # gem 'capistrano' # To use debugger # gem 'ruby-debug19', :require => 'ruby-debug' group :test do # Pretty printed test output gem 'turn', :require => false end
  • WYi
    WYi almost 13 years
    Sorry I have to reformat my previous comment a bit. I do have this gem installed and used in Gemfile: gem 'therubyracer-heroku', '0.8.1.pre3', :platforms => :ruby But it didn't work.
  • c3rin
    c3rin almost 13 years
    Heroku has a stack now that comes with node.js which probably takes care of this issue. Check it out at devcenter.heroku.com/articles/cedar