Проблема развертывания проекта Rails 3.1 для Heroku: не удалось найти исполняемую среду JavaScript
У меня возникли проблемы с развертыванием бета-проекта rails 3.1 для heroku. Проблема произошла на этапе миграции базы данных. Когда я побежал:
heroku rake db:migrate
Появилось сообщение об ошибке:
> 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)
Но я могу успешно запустить приложение локально, и у меня есть nodejs. Любая идея почему?
Здесь мой список драгоценных камней:
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)
Ответы
Ответ 1
Вам нужен механизм JavaScript для Rails 3.1 (у heroku его нет), и кажется, что движок JavaScript, который работает с Heroku, это rubyracer для heroku.
Rails использует execjs для выполнения JavaScript, а execjs поддерживает 7 движков JavaScript. Node.js - один, а rubyracer - один.
У Gerred Dillon была аналогичная проблема и написал об этом. В разделе комментариев был поднят вопрос о том, что это изменение производственного процесса, поскольку у вас уже есть nodejs как ваш локальный движок JavaScript. Соответствующий код:
group :production do
gem 'therubyracer-heroku', '0.8.1.pre3'
end
UPDATE: У Heroku есть новый стек, называемый Cedar, который они рекомендуют для Rails 3.1.0, (Запустите heroku stack
, чтобы узнать, в каком стек включено ваше приложение.) Heroku также имеет doc об обновлении до Rails 3.1.0 rc5. Они рекомендуют не использовать драгоценный камень therubyracer-heroku, поскольку его не нужно с rc5.
Если вы выполняете обновление с более раннего rc, обязательно обновите файл config/application.rb, а также выполните следующую команду:
heroku config:add PATH=vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin:bin
По-видимому, это установлено в новых приложениях, но существующие приложения не установили этот PATH.
Ответ 2
Вам не обязательно нужно время выполнения JavaScript для развертывания бета-версии Rails 3.1 для heroku.
Время выполнения JavaScript требуется только в том случае, если вы уменьшаете javascript при развертывании (т.е. с помощью uglifier), или если вы используете кофе script.
Похоже, что эта зависимость от выполнения javascript не будет присутствовать в финальной версии 3.1.
Если вы не возражаете против того, чтобы не уменьшать ваш javascript (а также если вы не используете кофе script), вы можете прокомментировать кофе- script, uglifier и execjs gems в Gemfile, а также прокомментируйте config.assets.js_compressor в production.rb, и вам должно быть хорошо идти.
Ответ 3
С даты этого сообщения вам все равно нужно указать
gem 'therubyracer-heroku', '0.8.1.pre3'
в вашем gemfile для успешного развертывания приложения Rails 3.1 на платформе Heroku Cedar.
Пока развертывание приложений Node на платформе Cedar возможно, Node не присутствует в стеке Cedar при развертывании приложений Rails, поэтому вам нужно связать свою собственную среду выполнения JavaScript.
Пока.
Я знаю, что люди на стороне Rails работают над удалением зависимости от времени выполнения js, http://yehudakatz.com/2011/06/14/what-the-hell-is-happening-to-rails/
и я уверен, что Heroku также изучает способы внедрения Rails 3.1.
Ответ 4
В моем случае это произошло после успешной загрузки в Heroku и доступа к странице.
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)):
Настройка пути с использованием конфигурации "heroku config: add PATH blah" не помогла.
"rake assets: precompile" просто решил это.
Надеюсь, это поможет кому-то вроде меня!