2010-09-07 17 views
5

Tôi đang sử dụng RVM, cách làm như sau:"Gói cài đặt" của Rails 3 là siêu nhanh (mất 1 giây), nhưng không có Rails nào ở đó sau đó? (Sử dụng RVM)

rvm install ree <--- (Ruby Enterprise Edition), or this can be 1.8.7 or 1.9.2 
rvm ree 
rvm gemset create 'proj' 
cd path/to/proj 
bundle install 

nên Gemfile trong dự án nói rằng:

gem 'rails', '3.0.0' 

bundle install là siêu nhanh, báo cáo

Using rails (3.0.0) 

nhưng sau đó khi tôi nhập

$ rails -v 
/Library/Ruby/Site/1.8/rubygems.rb:779:in `report_activate_error': Could not find RubyGem rails (>= 0) (Gem::LoadError) 
    from /Library/Ruby/Site/1.8/rubygems.rb:214:in `activate' 
    from /Library/Ruby/Site/1.8/rubygems.rb:1082:in `gem' 
    from /usr/bin/rails:18 

$ which rails 
/usr/bin/rails 

vì vậy bundle install không cài đặt đường ray làm đá quý? nhưng nếu tôi nhập script/rails -v, nó sẽ hiển thị là 3.0.0

Trả lời

12

Điều này là chính xác. bundle install sẽ không cài đặt Rails làm đá quý theo nghĩa thông thường. Bây giờ để giải thích tại sao.

Khi trình quản lý chạy một trình cài đặt, trình cài đặt sẽ cài đặt đá quý một thư mục: ~/.bundle/<type-of-ruby>/<version>/gems. Điều này khác với cách cài đặt chúng thông thường vào đường dẫn hệ thống. Khi một gem được cài đặt tại một đường dẫn hệ thống, tệp thực thi được tạo sẵn vì thư mục đó nằm trong đường dẫn tải. Bây giờ đây là số xấu, bởi vì bạn chỉ có thể có một tệp thực thi cho mỗi đá quý. Bạn đã cài đặt SomeGem v2 nhưng muốn sử dụng trình tạo từ SomeGem v1 chưa? Quá tệ.

Bundler giải quyết vấn đề này bằng cách cài đặt chúng vào vện nêu vị trí và chỉ đòi hỏi phiên bản cụ thể của đá quý nó cần (quy định bên trong Gemfile. Bằng cách chạy chỉ đơn giản rails, bạn đang cố gắng để chạy hệ thống thực thi (như trong một cung cấp bằng cách làm gem install rails) chứ không phải là một Bundler (được cung cấp bằng cách làm bundle install cho một dự án Rails).

để chạy một trong đó Bundler cài đặt bạn phải chạy nó như bundle exec rails này trong một thư mục có chứa một Gemfile rằng chỉ định bất kỳ phiên bản Rails nào. Bundler sẽ tải phiên bản Rails cụ thể và bây giờ bạn có thể chạy song song với sự cân bằng duy nhất là tiền tố bundle exec cho các lệnh.

Cá nhân tôi đã đặt bí danh này là be và hai ký tự trước khi một số lệnh là một sự cân bằng đáng giá để tránh Vòng tròn thứ bảy của Gem Conflict Hell theo ý kiến ​​của tôi.

+0

bây giờ, nhưng mọi hướng dẫn tôi thấy (Hướng dẫn chính thức Rails, Hướng dẫn Rails của Michael Hartl) nói cách sử dụng Rails chỉ là "đường ray tạo", và có lẽ, mọi người cần 'gem install rails' trước khi họ có thể có một dự án (hoặc ít nhất 1 người trong nhóm), để anh ta có thể có' script/rails' và 'bundle exec rails'. Vì vậy, 1 người này có thể đang sử dụng SomeGem v1 và SomeGem v2 cùng một lúc bất kỳ cách nào (Gem là Rails trong trường hợp này). Tôi nghĩ có lẽ một tài liệu có thể giải thích 3 cách gọi Rails ... –

+0

@Jian Lin: Vâng, để tạo một ứng dụng Rails ban đầu, bạn cần phải cài đặt gem Rails mà không cần sử dụng Bundler. Tuy nhiên, để chạy một dự án Rails, bạn chỉ cần cài đặt nó như là một gem được đóng gói. –

0

quy trình của bạn có vẻ chính xác (hãy chắc chắn sử dụng gemset vừa được tạo, xác minh bằng rvm info, làm rvm [email protected] nếu nó không nói gemset: 'proj'), vì vậy tôi sẽ bỏ đầu ra và thử đề xuất . Btw, ray cài đặt hoàn hảo với bundler.

Tôi đã đấu tranh với hệ thống ngọc hành vi lạ vs đá quý địa phương, có rất nhiều người dùng bundler, bao gồm Yehuda Katz, dẫn đến bài toàn diện này A Tale of Abort Traps

Nói tóm lại, nếu bạn chạy gói cài đặt trước bạn có đá đính kèm (không tìm thấy lỗi "không tìm thấy đá quý"), sau đó thực hiện gói cài đặt gem, tiếp theo là cài đặt gói khác, đá quý bundler đã được cài đặt vào hệ thống của bạn, chứ không phải là rvm.

Giải pháp: Xóa .bundle, (và làm trình gỡ cài đặt gem?). Sau đó, tôi sẽ mở một thuật ngữ mới, làm rvm ree @ proj và gói cài đặt gem trước khi cài đặt gói.

Yehuda nói trong bài đăng rằng nó đã được sửa trong phiên bản bundler mới, nhưng tôi đã trải qua điều này chỉ vài ngày trước (bundler 1.0.0). Hy vọng tôi đã giúp đỡ nhiều hơn nhầm lẫn với bảng :)

Các vấn đề liên quan