ExecJS và không thể tìm thấy thời gian chạy JavaScript


403

Tôi đang cố gắng sử dụng mẫu Mongoid / Devise Rails 3.1 ( MongoidDevise ) và tôi liên tục gặp lỗi khi ExecJS không thể tìm thấy thời gian chạy JavaScript. Đủ công bằng khi tôi chưa cài đặt, nhưng tôi đã thử cài đặt Node.js , MustangRuby Racer , nhưng không có gì hoạt động.

Tôi không thể tìm thấy thời gian chạy JavaScript. Xem sstephenson / ExecJS (GitHub) để biết danh sách các thời gian chạy có sẵn ( ExecJS::RuntimeUnavailable).

Tôi cần làm gì để làm việc này?


4
btw - Tôi đang sử dụng ubfox karmic.
srboisvert

Bạn thực sự nên xem xét thay đổi câu trả lời. Câu trả lời của Node.js gần như không tốt bằng execjs / rubyracer.
Sean Dunford

3
Các rubyracer có vấn đề khác với nó. Heroku không còn khuyến nghị đưa nó vào Gemfile của bạn nếu bạn có thể tránh nó. devcenter.heroku.com/articles/rails-asset-pipeline#therubyracer Tôi nghĩ rằng việc cài đặt thời gian chạy Javascript phù hợp trên Ubuntu là câu trả lời chính xác cho câu hỏi này.
M. Scott Ford

Câu trả lời:


436

Người dùng Ubuntu

Tôi đang dùng Ubuntu 11.04 và gặp vấn đề tương tự. Cài đặt Node.js đã sửa nó.

Kể từ Ubuntu 13.04 x64, bạn chỉ cần chạy:

sudo apt-get install nodejs

Điều này sẽ giải quyết vấn đề.


Người dùng CentOS / RedHat

sudo yum install nodejs

1
thử nó. không may mắn. Tôi tự hỏi nếu nó là một xung đột rvm hoặc một cái gì đó. Mọi thứ người khác đề nghị đã không làm việc cho tôi.
srboisvert

76
gem 'execjs' gem 'Therubyracer' đó là một giải pháp tốt hơn cái này.
dwaynemac

26
Heroku hiện đang làm nản lòng nhà trị liệu mạnh mẽ do sử dụng bộ nhớ. Tôi đã cài đặt nodejs trên máy dev của mình theo câu trả lời này và đưa Therubyracer ra khỏi gemfile của tôi. Xem thêm stackoverflow.com/questions/7092107/ khăn .
Mark Berry

11
@dwaynemac Tôi không đồng ý. Tôi muốn thay vào đó là thời gian chạy như một thư viện hệ điều hành (như với Mac và Windows theo mặc định), thay vì thêm một viên ngọc khác vào danh sách phụ thuộc.
William Denniss

1
Có vẻ như Therubyracer và execjs đang gây ra vấn đề với việc triển khai heroku, trừ khi có một cái gì đó đã được sửa đổi mà tôi đã bỏ lỡ. Đây là giải pháp ưa thích.
Sturm

445

Chỉ cần thêm ExecJSRuby Racer vào tệp đá quý của bạn và chạy bundle installsau.

gem 'execjs'

gem 'therubyracer'

Mọi thứ sẽ ổn sau.


6
Điều này làm việc cho tôi, rails 3.1rc4 và Ubuntu 11.04 (lần thử đầu tiên của tôi với rails 3.1). Tôi đã cố gắng tạo ra một giàn giáo khi tôi gặp lỗi. Vẫn còn khá khập khiễng rằng đường ray 3.1 bị "vỡ" ra khỏi hộp.
wonderfulthunk

35
Đối với Rails 3.1 RC 6, bạn chỉ cần xác địnhgem 'therubyracer'
Amree

5
Có cách nào để có những viên đá quý này trong Gemfile mặc định khi một ứng dụng mới được tạo không?
Richard Fawcett

2
đây là một giải pháp tốt hơn so với cài đặt node.js. Nếu bạn đang triển khai đến một máy chủ từ xa hoặc chia sẻ ứng dụng với các nhà phát triển khác, việc mọi người cài đặt node.js sẽ đau đớn hơn nhiều so với việc chỉ chạy gói cài đặt, dù sao họ cũng sẽ làm.
jdkealy

19
Heroku hiện đang làm nản lòng nhà trị liệu mạnh mẽ do sử dụng bộ nhớ. Tôi đã cài đặt nodejs trên máy dev của mình ( github.com/joyent/node/wiki/ mài) và đưa Therubyracer ra khỏi gemfile của tôi. Xem thêm stackoverflow.com/questions/7092107/ khăn .
Mark Berry

77

Trong tệp Gem của bạn, viết

gem 'execjs'
gem 'therubyracer'

và sau đó chạy

bundle install

Mọi thứ hoạt động tốt với tôi :)


9
Bạn không cần thêm 'execjs'
MiguelSantirso

Có bạn ngay trong đường ray 3.2.1, bạn chỉ phải sử dụng gem'therubyracer '
manut nautiyal

Cảm ơn @manish nautiyal và @ Peter Mortensen. nó hoạt động với tôi
Ravindra

48

Tôi gặp một vấn đề tương tự: ứng dụng Rails 3.1 của tôi hoạt động tốt trên Windows nhưng gặp lỗi tương tự như OP khi chạy trên Linux. Cách khắc phục hiệu quả với tôi trên cả hai nền tảng là thêm các mục sau vào Gemfile:

gem 'therubyracer', :platforms => :ruby

Bí quyết là biết rằng :platforms => :rubythực sự có nghĩa là chỉ sử dụng loại đá quý này với "C Ruby (MRI) hoặc Rubinius, nhưng KHÔNG phải Windows."

Các giá trị khác có thể cho :platformsđược mô tả trong các bundlertrang người đàn ông .

FYI: Windows có một công cụ JavaScript tích hợp execjscó thể định vị. Trên Linux không có phần dựng sẵn mặc dù có sẵn một số bản có thể cài đặt. therubyracerlà một trong số họ. Những người khác được liệt kê trong execjs README.md .


Cảm ơn, cái này đã sửa nó cho tôi trên Ubuntu Oneiric bằng cách sử dụng cài đặt rvm của ruby ​​1.9.3 và Rails 3.2.1
Yashima

Cảm ơn ngài rất nhiều!
DaTroop

Tôi gặp phải lỗi trên máy chủ CentOS đã cài đặt node.js. Điều này đã cho tôi vượt qua nó. Cảm ơn!
ncherro

36

Thêm đá quý sau vào Gemfile của tôi đã giải quyết được vấn đề:

gem 'therubyracer'

Sau đó gói các phụ thuộc mới của bạn:

$ bundle install

đồng thời thêm đá quý 'execjs' trong Gemfile
Bijendra

6
execjs đã được bao gồm bởi đường ray bây giờ. Nó cũng chỉ được yêu cầu trong các ứng cử viên phát hành.
JDutil

16

Một cách khác là chỉ bó mà không có nhóm đá quý chứa những thứ bạn không có.

Làm như vậy:

bundle install --without assets

bạn hoàn toàn không phải sửa đổi Gemfile, với điều kiện tất nhiên là bạn không làm công cụ chuỗi tài sản - thường áp dụng trong các môi trường không phát triển. Gói sẽ ghi nhớ cài đặt '--without của bạn trong tệp .bundle / config.


Câu trả lời tốt nhất. Đã làm việc cho đường ray phiên bản 3.2.3
Frantzdy Romain

1
Điều này là tuyệt vời, và một sửa chữa đơn giản như vậy. Trang web Heroku nói rằng RubyRacer không còn cần thiết nữa (với ngăn xếp Cedar) vì vậy tôi đã bối rối về lý do tại sao đột nhiên chương trình của tôi không chạy cục bộ. Điều này đã lừa
Mike Blyth

6

Thêm đá quý sau vào tập tin đá quý của bạn

gem 'therubyracer'
gem 'execjs'

và chạy

bundle install

Bạn xong việc rồi :)


6

Đối với linux Amazon (AMI):

sudo yum install nodejs npm --enablerepo=epel

1
Cảm ơn, điều này nên ở cấp độ cao hơn
David Mauricio

điều này rất cần thiết để có được một triển khai capistrano để hoạt động trên bản phân phối linux tiêu chuẩn AWS.
jjk


4

Tôi đã có lỗi tương tự nhưng chỉ trên máy chủ dàn của tôi không phải môi trường sản xuất của tôi. nodejs đã được cài đặt trên cả hai môi trường.

Bằng cách gõ:

which node

Tôi phát hiện ra rằng lệnh nút được đặt trong: / usr / bin / nút khi sản xuất nhưng: / usr / local / bin / nút trong dàn.

Sau khi tạo một liên kết tượng trưng trên dàn, tức là:

sudo ln -s /usr/local/bin/node /usr/bin/node

các ứng dụng sau đó làm việc trong dàn.

Không ầm ĩ không ồn ào.


hoạt động như quyến rũ! Một lời khuyên: Tôi cần thiết làm cho liên kết tượng trưng cho nodejscũng
Rafael Gomes Francisco

3

Đừng sử dụng RubyRacer vì nó không tốt cho bộ nhớ. Cài đặt Node.js theo đề xuất của một số người ở đây là một ý tưởng tốt hơn.

Danh sách thời gian chạy có sẵn này có thể được Thư viện ExecJs sử dụng cũng ghi lại việc sử dụng Node.js

https://github.com/sstephenson/execjs

Vì vậy, Node.js không phải là một giải pháp quá mức và giải pháp tốt hơn nhiều so với việc sử dụng RubyRacer.



0

Tôi bắt đầu gặp vấn đề này khi tôi bắt đầu sử dụng rbenv với Ruby 1.9.3 trong đó hệ thống ruby ​​của tôi là 1.8.7. Đá quý được cài đặt ở cả hai nơi nhưng vì một số lý do, tập lệnh rails không nhận được. Nhưng việc thêm "execjs" và "Therubyracer" vào Gemfile đã làm nên chuyện.


0

Trong tập tin đá quý của bạn Uncomment dòng này.

19 # đá quý 'trị liệu', nền tảng :: ruby

Và chạy gói cài đặt

Bạn đã sẵn sàng để làm việc. :)


0

Cố gắng gỡ lỗi trong RubyMine bằng Ubuntu 18.04, Ruby 2.6. *, Rails 5, & RubyMine 2019.1.1 , tôi gặp vấn đề tương tự.

Để giải quyết vấn đề, tôi bỏ mini_racerdòng từ tôi Gemfilevà sau đó chạy bundle:

# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby

Thay đổi thành:

# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'mini_racer', platforms: :ruby

0

Tôi đã cài đặt nodequa nvm và gặp phải sự cố này khi triển khai với Capistrano. Capistrano không tải nvm tự động vì nó chạy không tương tác.

Để khắc phục, chỉ cần di chuyển các dòng mà nvm thêm vào của bạn ~/.bashrclên trên cùng. Các tập tin sau đó sẽ trông giống như thế này:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.