Virtualenv'in Ruby eşdeğeri?


165

Python programı virtualenv'e benzer bir şey var mı ?

Temel olarak Python paketlerini korumalı bir ortama kurmanıza izin verir, bu nedenle easy_install djangosistem çapında site paketleri dizininize gitmez , sanal olarak oluşturulan dizine gider.

Örneğin:

$ 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

RubyGems için böyle bir şey var mı?

Yanıtlar:


85

RVM, sanal yakanın nasıl çalıştığına daha yakın çalışır, çünkü farklı yakut sürümlerini ve mücevherlerini vb.


5
Hem korumalı alanı hem de RVM'yi denedim ve RVM'nin çok daha iyi bir çözüm olduğunu düşünüyorum.
ivanjovanovic

9
ivanjovanovic. Neden RVM'yi sanal alandan daha iyi buldunuz?
pwan

68

Ne korumalı alan, RVM, ne de rbenv, uygulamanızın mücevher bağımlılıklarının sürümlerini yönetmez. Bunun için araç paketleyicidir .

  • uygulamanızın bağımlılık bildirimi olarak bir Gemfile kullanın
  • bundle installbu bağımlılıkların açık sürümlerini yalıtılmış bir konuma yüklemek için kullanın
  • bundle execuygulamanızı çalıştırmak için kullanın

6
Ayrıca, şahsen insanların rbenv / rvm'i aşırı kullandığını düşünüyorum. Aynı makinede kesinlikle yakut, izole edilmiş ruby ​​sürümlerine ihtiyacınız yoksa ve muhtemelen istemiyorsanız rbenv / rvm kullanmayın. Onların "soyutlamaları" ücretsiz gelmez; Onları hata ayıklamak için zaman harcayacağınızı garanti ediyorum. Tavsiyem: İşletim sisteminizin paket yöneticisiyle Ruby'yi kurmanız yeterlidir. En sonuncusu en iyisidir.
pje

6
Bir şey mi kaçırıyorum? Bundler, paketleri varsayılan olarak yüklemeye çalışır.
kefalet

6
İzole edilmiş ortamlar, modern bir iş akışında neredeyse isteğe bağlı değildir. Eğer sistem yakut ve sistem paket yöneticisiyle itimat Eğer varsa HAYIR sizin yüklemeler tekrarlanabilir olacak garanti ve yüzüne batacak şu dağıtma zaman gelir. Tabii ki zaman zaman yükleme canavarla mücadele aşağı bataklık olacak. Bu da iyi bir şey. Çünkü geliştirici ortamınızdaki sorunları çözersiniz, böylece onları canlı ortamınızda asla çözmeniz gerekmez. Tekrarlamak gerekirse, kod için ödeme alırsanız asla sistem ortamını kullanmayın. Akıl sağlığı için yalıtılmış bir ortam kullanın.
Shayne

19

Kimse rbenv'den bahsetmemiş gibi görünüyor .


rbenv bir ruby ​​yöneticisidir, ancak paket düzeyinde (virtualenv eşdeğeri) sanal bir env sunabilmek için yerel olarak bir gemset yöneticisi sunmaz.
yekta

16

Sanırım sandbox'ı seveceksin .


9
Kutsal saçmalık, bu yeniden $HOMEmi yazıyor ?! Taşların buna ne ihtiyacı var ? Üzücü olan şey, bu iş için gördüğüm en iyi şey. Bundler bile sistem yakut yolunda varsayılan olarak kurulur.
Chris R

6
sandbox ~ 4 yıl içinde güncellendi (son taahhüt Aralık 2008 idi), RVM hala aktif gelişme aşamasında (son taahhüt dün)
dbr

16

Bunu Bundler ile yapmamın yolunu anlatacağım (RVM - RVM ile birlikte kullanıyorum ve yakutları yönetmek için varsayılan bir küresel mücevher seti, projeye özgü mücevherleri işlemek için Bundler)

bundler install --binstubs --path vendor

Bir projenin kök dizininde bu komutu çalıştırmak Gemfile listelenen taşlar yükler, libs koymak ./vendorve tüm yürütülebilir dosyalar ./binve tüm requires (kullanıyorsanız bundle consoleveya Bundler gerektirir) bu exes ve libs başvurulacaktır.

Benim için çalışıyor.


MacOS'takilere yönelik bir ipucu vendor.noindex, Spotlight aramaları yolunuzu adlandırırsanız, tedarik edilen mücevherlerden indekslenen verilerle karıştırılmaz.
Iain

1
Ben de bunu yapıyorum (ile rbenv, ama bu başka bir hikaye), çünkü gemset ve yakut versiyonunu izole ediyor. Sistem çapında hiçbir şey kurulmaz ve her projenin tüm bağımlılıkları iyi beyan edilir. İpucu: bundle config path vendorbu argümanı asla unutmamak için kullanın .
nandilugio

15

Mücevherleri yalnızca kök olmayan olarak yüklemeniz gerekiyorsa, GEM_HOMEortam değişkenini ayarlamayı deneyin . Sonra sadece koş gem.

Örneğin:

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

Müthiş! OSX'te bu klasör gizlidir:export GEM_HOME=$HOME/.local/gems
Bruno

1
GEM_HOME=$HOME/.localAynı .binklasörü paylaşması daha kolay olabilir . Bu durumda $PATHdeğişkenimizi güncellemek zorunda değiliz .
Bruno


Güncellendiğinde birbirini bozmayan araçlar yüklemek için şimdiye kadar gördüğüm en temiz bağımlılık yoksama yaklaşımı (kalan tek şey sizin için bir takma ad eklemektir ~/.bashrcve işiniz bitmiştir). +1
Paradoxis

4

Direnv tavsiye ederim . Kabuk için bir ortam değiştiricidir.

Her komut isteminden önce, geçerli ve üst dizinlerde ".envrc" dosyasının var olup olmadığını kontrol eder. Dosya varsa (ve yetkilendirilmişse), bir bash alt kabuğuna yüklenir ve dışa aktarılan tüm değişkenler daha sonra direnv tarafından yakalanır ve geçerli kabuk kullanılabilir hale getirilir.

İşte direnv nasıl kullanılacağı ile yakut yüklemek

+ ruby-install

Bunu şuraya ekle: ~/.direnvrc

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

Ruby-install ( brew install ruby-install) 'ı ve bir demet yakut takın.

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

Ve sonra kolaylık sağlamak için birkaç sembolik bağlantı yapı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

Ve son olarak herhangi bir projede .envrc:

use ruby 2.0

Bu, tüm mücevherleri proje .direnv/rubydizinine koyacaktır (açılış mücevherlerini kolaylaştırır). bundler sarıcı ikili dosyaları koyacaktır .direnv/bin(artık yok bundle exec!).

+ rbenv

use rbenvKomutu herhangi bir .envrcdosyaya ekleyerek rbenv kullanmak da mümkündür . Bu, yakut ambalajları PATH'a koyacak olan rbenv'yi aktive edecektir.

Bunun çalışması için rbenv dosyasının .bashrc veya .zshrc dosyasına yüklenmesinin gerekli olmadığını unutmayın.

+ RVM

İşte yakut projelerinde kullandığım en karmaşık .envrc:

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

rvm sizin için doğru yakut versiyonunu seçmek için kullanılır

düzen komutları normal ortam değişkenlerinin bazılarını otomatik olarak ayarlar. Şimdilik sadece yakut düzeni var. Yaptığı şey GEM_HOME ortam değişkenini ve bin dizinini yolunuza ayarlamaktır. Ruby sürümüne bağlı olduğu için "rvm" den sonra aramayı unutmayın. Her yakut mizanpaj dizininin kendi GEM_HOME'u olduğundan, rvm'nin değerli taşlarını kullanmanıza gerek yoktur.

PATH_add, verilen göreli yolu önceliklendirir ve genişletir. Bu durumda, bundler binstub'larını kendi bin scriptlerimden ayırmak için bunubundle install --binstubs .direnv/bundler-bin

Bu komutların tam olarak ne yaptığını öğrenmek istiyorsanız, şimdilik: cat direnv stdlib| az


2
Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve bağlantıyı referans olarak sağlamak daha iyidir. Bağlantı verilen sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir. - Yorumdan
jezrael

@ jezrael Yorumunuz için teşekkür ederiz!
Shin Kim

1
Süper, sorun değil.
jezrael

1

Mineshaft bir süredir üzerinde çalıştığım ve geliştirme çalışmalarına devam ettiğim bir proje.

Her ikisi de virtualenv'in nasıl çalıştığına benzer sanal ortamlar oluşturma yeteneği sunar ve Ruby'yi küresel olarak da yükleyebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.