TL; DRrbenv: Còn sống sót mà không gemsets
- Đừng bận tâm với gemsets; nhiều phiên bản của một viên ngọc có thể được cài đặt đồng thời.
- Khi cần, hãy chỉ định phiên bản cần thực thi sử dụng ký hiệu
$ gem-based-binary _version_ args
. - Sử dụng
bundle exec
khi bạn có Gemfile chỉ định phiên bản.
gem install rails -v 3.2.13
rails _3.2.13_ new Project2
cd Project2
bundle exec rails server
UPDATE: 2015-06-04
tôi đã viết câu hỏi này cách đây ba năm. Một phần, nó được dựa trên một giả định sai lầm, và một phần tình hình đã thay đổi kể từ đó. Với sự đánh giá cao về @indirect cho câu trả lời ban đầu của mình, tôi muốn gọi sự chú ý đến câu trả lời mới hơn của (ít được upvoted) của @ kelvin, tóm tắt ở trên.
Giả định sai của tôi: Chỉ có thể cài đặt một phiên bản duy nhất của một viên đá quý tại một thời điểm, do đó cần phải có gemets để cô lập không gian tên. Không đúng. Nhiều phiên bản của một viên ngọc có thể được cài đặt đồng thời. Lệnh gần đây nhất sẽ được sử dụng khi được gọi từ một dòng lệnh, trừ khi bạn có một Gemfile chỉ định ràng buộc phiên bản và gọi lệnh thông qua bundle exec
hoặc chỉ định phiên bản làm đối số đầu tiên của nó.
Xem thêm How can I call an older version of a gem from the commandline? re: ký hiệu gạch dưới phiên bản.
gốc câu hỏi:
Tôi có nhiều dự án đi vào sử dụng các phiên bản khác nhau của Rails. Tôi có một quy trình làm việc (được mô tả bên dưới) để tạo các dự án bằng cách sử dụng các phiên bản đường ray cụ thể và giữ các dự án được tách biệt với nhau. Tôi muốn thử nghiệm với các quy trình công việc khác, đặc biệt, sử dụng rbenv thay vì RVM, nhưng không rõ làm thế nào để làm như vậy.
HỎI: các thực hành tốt nhất hiện nay để tạo đường ray nhiều dự án, từng sử dụng một phiên bản khác nhau của đường ray, khi đưa ra sử dụng rbenv và bundler, như trái ngược với rbenv-gemset hoặc RVM là gì ?
SỬ DỤNG TRƯỜNG HỢP: Tôi có hai dự án đường ray, được gọi là ProjectA và ProjectB. ProjectA được phát triển bằng một phiên bản đường ray ("RailsA"), trong khi ProjectB sử dụng một phiên bản khác ("RailsB"). Làm thế nào để quản lý có cả hai phiên bản được cài đặt?
PHỤ LỤC GEMSETS: Khi tôi bắt đầu với phát triển Rails, tôi đã sử dụng RVM. Ngoài việc hỗ trợ nhiều, đồng thời cài đặt của ruby, RVM hỗ trợ có nhiều Named Gem Sets.Mỗi dự án có bộ sưu tập độc lập riêng của mình đá quý (bao gồm cả đường ray chính nó) gọi là gemset:
rvm gemset create RailsA
rvm gemset use RailsA
# RailsA. Note: My question is not version-specific.
gem install rails --version 3.0
rails new ProjectA
cd ProjectA
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
cd ..
## Now do the same for ProjectB
rvm gemset create RailsB
rvm gemset use RailsB
gem install rails --version 3.2
rails new ProjectB
cd ProjectB
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
Lưu ý: rất tạo các thư mục dự án cần được thực hiện (IMHO) bởi một lệnh rails new
sử dụng mong muốn phiên bản đường ray vì các tệp khung hình thay đổi từ phiên bản này sang phiên bản khác. (Có lẽ tôi nên xem xét lại tiền đề này?)
cách tiếp cận BUNDLER: Tôi đã chơi với việc sử dụng rbenv thay vì RVM, nhưng tôi không hiểu được quy trình làm việc một cách rõ ràng. Trong README.md, Sam Stephenson viết rằng "rbenv không ... quản lý gemets. Bundler là một cách tốt hơn để quản lý các phụ thuộc ứng dụng." Có một plugin (rbenv-gemset) để nhận được kết quả tương tự như đá quý của rvm, nhưng Sam rõ ràng ủng hộ bằng cách sử dụng Bundler thay thế. Thật không may, anh ta không giải thích về công việc sẽ trông như thế nào. Ngay cả trang web Bundler không kết nối rõ ràng tất cả các dấu chấm về cách tách biệt một dự án khỏi một dự án khác. Một số blogsandgists đến để giải cứu, cho thấy ~/.bundle/config
tập tin sau đây:
---
BUNDLE_PATH: vendor/bundle
(BTW, tôi không chắc chắn những gì mà "---" được về Các tài liệu làm cho không đề cập đến nó và nó doesn. dường như tạo sự khác biệt.)
Điều này mang lại hiệu quả cho mỗi đường ray dự án gemset của riêng nó, lưu trữ các gem trong ProjectX/vendor/bundle /. Trong thực tế, đường ray chính nó sẽ được (lại) được cài đặt ở đó, làm cho dự án hoàn toàn độc lập với phần còn lại của môi trường của tôi, một khi tôi chạy bundle install
.
Nhưng con voi trong phòng là vấn đề về gà và trứng khi tạo thư mục dự án đường ray trong địa điểm đầu tiên !! Để tạo thư mục ProjectA bằng RailsA, tôi cần cài đặt đường ray (và nhiều phụ thuộc của nó) trước tiên. Nhưng khi tôi muốn tạo ProjectB, tôi phải chuyển sang sử dụng RailsB. Nếu không có đá quý, tôi phải làm một số nâng cấp/hạ cấp nghiêm trọng. Không mát mẻ.
Một giải pháp có thể đơn giản là không phải lo lắng về phiên bản đường ray nào tôi sử dụng để tạo thư mục ProjectX. Nếu sau đó tôi sử dụng đường ray 3.0 để tạo một dự án 3.2, tôi có thể tự tạo cây ứng dụng/tài sản. Nhưng điều đó chỉ làm tôi khó chịu. Không có cách nào tốt hơn?
Âm thanh như bạn THỰC SỰ muốn sử dụng RVM và đá quý. Bất kỳ lý do cụ thể nào bạn chọn KHÔNG sử dụng công cụ giải quyết vấn đề của bạn một cách thanh lịch nhất? –
Tôi không cam kết với bất kỳ công cụ cụ thể nào (và tôi hoàn toàn không muốn tham gia vào cuộc thảo luận "RVM vs rbenv"). Tôi quen thuộc hơn với RVM và tôi hiểu một quy trình làm việc để sử dụng nó. Tôi muốn hiểu quy trình làm việc tương đương cho rbenv, nếu không có gì khác chỉ để trôi chảy với nhiều công cụ khác nhau. –
Bạn nói trang web của Bundler không giải thích cách "cô lập một dự án từ một dự án khác". Nếu "cô lập" có nghĩa là mỗi dự án có một bản sao riêng biệt của cùng một phiên bản và đá quý giống nhau (ví dụ: rack-1.4.0), Bundler không làm điều đó. Nó duy trì một bản sao của mỗi viên đá quý trên đĩa - và bất kỳ ứng dụng nào cần đá quý và phiên bản đó có thể sử dụng nó mà không can thiệp vào các ứng dụng khác.Nó giống như chạy 2 trường hợp 'bash'; bạn không có nhiều bản sao của 'bash' trên đĩa, nhưng nhiều bản sao trong bộ nhớ. Gemsets cho phép bạn có nhiều bản sao trên đĩa (có thể dễ dàng hơn để xóa khi không còn cần thiết) – Kelvin