Ruby tương đương với virtualenv?


165

Có cái gì đó tương tự như virtualenv tiện ích Python không?

Về cơ bản, nó cho phép bạn cài đặt các gói Python vào môi trường hộp cát, do đó, easy_install djangokhông đi vào thư mục gói toàn hệ thống của bạn, nó sẽ đi vào thư mục được tạo ảo.

Ví dụ:

$ virtualenv test
New python executable in test/bin/python
Installing setuptools...cd .........done.
$ cd test/
$ source bin/activate
(test)$ easy_install tvnamer
Searching for tvnamer
Best match: tvnamer 0.5.1
Processing tvnamer-0.5.1-py2.5.egg
Adding tvnamer 0.5.1 to easy-install.pth file
Installing tvnamer script to /Users/dbr/test/bin

Using /Library/Python/2.5/site-packages/tvnamer-0.5.1-py2.5.egg
Processing dependencies for tvnamer
Finished processing dependencies for tvnamer
(test)$ which tvnamer 
/Users/dbr/test/bin/tvnamer

Có cái gì đó như thế này cho RubyGems?

Câu trả lời:


84

RVM hoạt động gần hơn với cách virtualenv hoạt động vì nó cho phép bạn sandbox các phiên bản ruby ​​khác nhau và đá quý của chúng, v.v.


5
Đã thử cả sandbox và RVM và nghĩ rằng RVM là giải pháp tốt hơn nhiều.
ivanjovanovic

9
ivanjovanovic. Tại sao bạn tìm thấy RVM tốt hơn hộp cát?
pwan

67

Cả sandbox, RVM và rbenv đều không quản lý các phiên bản phụ thuộc đá quý của ứng dụng của bạn. Công cụ cho điều đó là bundler .

  • sử dụng Gemfile làm tuyên bố phụ thuộc ứng dụng của bạn
  • sử dụng bundle install để cài đặt các phiên bản rõ ràng của các phụ thuộc này vào một vị trí biệt lập
  • sử dụng bundle execđể chạy ứng dụng của bạn

6
Ngoài ra, cá nhân tôi nghĩ mọi người lạm dụng rbenv / rvm. Nếu bạn không nhất thiết phải có nhiều phiên bản ruby ​​riêng biệt trên cùng một máy và bạn có thể không nên sử dụng rbenv / rvm. "Trừu tượng" của họ không đến miễn phí; Tôi đảm bảo bạn sẽ phải dành thời gian để gỡ lỗi chúng tại một số điểm. Lời khuyên của tôi: chỉ cần cài đặt ruby ​​với trình quản lý gói của hệ điều hành. Mới nhất là lớn nhất.
pje

6
Tui bỏ lỡ điều gì vậy? Bundler vẫn cố gắng cài đặt các gói hệ thống theo mặc định.
gièm pha

6
Môi trường biệt lập là khá nhiều không tùy chọn trong một quy trình làm việc hiện đại. Nếu bạn dựa vào ruby ​​hệ thống và trình quản lý gói hệ thống, bạn KHÔNG đảm bảo các cài đặt của bạn sẽ được lặp lại và điều đó sẽ cắn bạn trong thời gian triển khai. Tất nhiên, đôi khi bạn sẽ bị sa lầy khi chiến đấu với quái vật cài đặt. Đó cũng là một điều tốt. Bởi vì bạn giải quyết các vấn đề trong môi trường dev của bạn nên bạn không bao giờ phải giải quyết chúng trong môi trường sống của bạn. Để lặp lại, nếu bạn được trả tiền để mã không bao giờ sử dụng môi trường hệ thống. Sử dụng một môi trường biệt lập, vì lợi ích của sự tỉnh táo.
Shayne

19

Không ai có vẻ đã đề cập đến rbenv .


rbenv là một trình quản lý ruby, nhưng ở cấp độ gói (tương đương với virtualenv), nó không cung cấp một trình quản lý đá quý để có thể cung cấp một env ảo.
yekta

16

Tôi nghĩ bạn sẽ thích hộp cát .


9
Holy crap, mà viết lại $HOME?! Cái quái gì không đá quý cần cho? Điều đáng buồn là, đó là điều tốt nhất tôi từng thấy cho công việc. Ngay cả các gói mặc định để cài đặt trong đường dẫn ruby ​​hệ thống.
Chris R

6
sandbox đã không được cập nhật trong ~ 4 năm (lần cam kết cuối cùng là vào tháng 12 năm 2008), RVM vẫn đang trong quá trình phát triển tích cực (lần cam kết cuối cùng là vào ngày hôm qua)
dbr

16

Tôi sẽ đề cập đến cách tôi làm điều này với Bundler (mà tôi sử dụng với RVM - RVM để quản lý các viên hồng ngọc và một bộ đá quý toàn cầu mặc định, Bundler để xử lý các loại đá quý cụ thể của dự án)

bundler install --binstubs --path vendor

Chạy lệnh này trong thư mục gốc của dự án sẽ cài đặt các viên đá quý được liệt kê từ Gemfile của bạn, đặt lib vào ./vendorvà mọi thực thi trong ./binvà tất cả require(nếu bạn sử dụngbundle console hoặc Bundler yêu cầu) sẽ tham chiếu các exes và lib này.

Làm việc cho tôi.


Một mẹo nhỏ cho những người trên macOS, nếu bạn đặt tên cho đường dẫn vendor.noindextìm kiếm Spotlight của bạn sẽ không bị lộn xộn với dữ liệu được lập chỉ mục từ các viên đá quý được bán.
Iain

1
Đây cũng là những gì tôi làm (với rbenv, nhưng đó là một câu chuyện khác), vì nó cô lập phiên bản đá quý và phiên bản ruby. Không có gì được cài đặt trên toàn hệ thống và mọi dự án đều có các phụ thuộc được khai báo tốt. Mẹo: sử dụng bundle config path vendorkhông bao giờ quên đối số đó.
nandilugio

15

Nếu bạn chỉ cần cài đặt đá quý là không root, hãy thử đặt GEM_HOMEbiến môi trường. Sau đó chạy đigem .

Ví dụ:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc

Tuyệt vời! Trên OSX thư mục đó bị ẩn:export GEM_HOME=$HOME/.local/gems
Bruno

1
Nó có thể dễ sử dụng GEM_HOME=$HOME/.localhơn để chia sẻ cùng một .binthư mục. Trong trường hợp đó, chúng tôi không phải cập nhật $PATHbiến của chúng tôi .
Bruno


Cho đến nay, cách tiếp cận không phụ thuộc rõ ràng nhất tôi từng thấy để cài đặt các công cụ không phá vỡ nhau khi được cập nhật (tất cả những gì còn lại là thêm bí danh trong bạn ~/.bashrcvà bạn đã hoàn thành). +1
Nghịch lý

4

Tôi khuyên bạn nên direnv . Nó là một công cụ chuyển đổi môi trường cho vỏ.

Trước mỗi dấu nhắc, nó sẽ kiểm tra sự tồn tại của tệp ".envrc" trong thư mục hiện tại và thư mục gốc. Nếu tệp tồn tại (và được ủy quyền), nó được tải vào một vỏ con bash và tất cả các biến được xuất sau đó được direnv thu thập và sau đó cung cấp vỏ hiện tại.

Dưới đây là cách sử dụng direnv với ruby-install

+ cài đặt ruby

Thêm cái này vào ~/.direnvrc

use_ruby() {
  local ruby_root=$HOME/.rubies/$1
  load_prefix "$ruby_root"
  layout_ruby
}

Cài đặt ruby-install ( brew install ruby-install) và cài đặt một bó hồng ngọc.

ruby-install ruby 1.9.3
ruby-install ruby 2.0.0
ruby-install ruby 2.2.0

Và sau đó tạo một vài liên kết tượng trưng cho thuận tiện:

ln -s .rubies/1.9 ruby-1.9.3-p*
ln -s .rubies/2.0 ruby-2.0.0
ln -s .rubies/2.2 ruby-2.2.0

Và cuối cùng trong bất kỳ dự án nào .envrc:

use ruby 2.0

Điều này sẽ đặt tất cả các đá quý trong .direnv/rubythư mục của dự án (làm cho việc mở đá quý dễ dàng hơn). bundler sẽ đặt các tệp nhị phân của trình bao bọc .direnv/bin(không còn nữa bundle exec!).

+ rbenv

Cũng có thể sử dụng rbenv bằng cách thêm use rbenvlệnh trong bất kỳ.envrc tệp . Điều này sẽ kích hoạt rbenv, từ đó sẽ đưa các gói ruby ​​vào PATH.

Lưu ý rằng không cần thiết phải cài đặt rbenv trong .bashrc hoặc .zshrc để làm việc này.

+ RVM

Đây là .envrc phức tạp nhất mà tôi sử dụng cho các dự án ruby:

rvm use 1.8.7
layout ruby
PATH_add .direnv/bundler-bin

rvm được sử dụng để chọn phiên bản ruby ​​phù hợp với bạn

lệnh layout tự động đặt một số biến môi trường thông thường. Để bây giờ chỉ có bố trí ruby ​​tồn tại. Những gì nó làm là đặt biến môi trường GEM_HOME và thư mục bin của nó vào đường dẫn của bạn. Bởi vì nó phụ thuộc vào phiên bản ruby, hãy đảm bảo gọi nó sau "rvm". Vì mỗi thư mục bố cục của ruby ​​có GEM_HOME riêng, bạn không cần sử dụng các viên ngọc của rvm.

PATH_add chuẩn bị trước và mở rộng đường dẫn tương đối đã cho. Trong trường hợp đó, tôi sử dụng điều này để tách riêng các binstub của trình biên dịch khỏi các tập lệnh bin của riêng tôi vớibundle install --binstubs .direnv/bundler-bin

Nếu bạn muốn tìm hiểu chính xác những lệnh đó làm gì, bây giờ: cat direnv stdlib| ít hơn


2
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi. - Từ đánh giá
jezrael

@ jezrael Cảm ơn bình luận của bạn!
Shin Kim

1
Siêu, không vấn đề gì.
jezrael

1

Mineshaft là một dự án mà tôi đã làm việc một thời gian và đang tiếp tục phát triển.

Nó cung cấp khả năng vừa tạo môi trường ảo gần giống như cách virtualenv hoạt động và cũng có thể cài đặt Ruby trên toàn cầu.

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.