Rubinowy odpowiednik virtualenv?

165

Czy jest coś podobnego do narzędzia virtualenv w języku Python ?

Zasadniczo umożliwia instalowanie pakietów Pythona w środowisku piaskownicy, więc easy_install djangonie trafia do katalogu pakietów witryn w całym systemie, ale trafia do katalogu utworzonego przez virtualenv.

Na przykład:

$ 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

Czy jest coś takiego dla RubyGems?

dbr
źródło

Odpowiedzi:

84

RVM działa bliżej tego, jak działa virtualenv, ponieważ umożliwia piaskownicę różnych wersji ruby ​​i ich klejnotów itp.

Van Nguyen
źródło
5
Wypróbowałem zarówno sandbox, jak i RVM i uważam, że RVM jest znacznie lepszym rozwiązaniem.
ivanjovanovic
9
ivanjovanovic. dlaczego uważasz, że RVM jest lepszy niż piaskownica?
pwan
67

Ani sandbox, RVM, ani rbenv nie zarządzają wersjami zależności gem aplikacji. Narzędziem do tego jest bundler .

  • użyj Gemfile jako deklaracji zależności aplikacji
  • służy bundle installdo instalowania jawnych wersji tych zależności w izolowanej lokalizacji
  • użyj bundle execdo uruchomienia aplikacji
pje
źródło
6
Osobiście uważam również, że ludzie nadużywają rbenv / rvm. Jeśli absolutnie nie potrzebujesz wielu izolowanych wersji Ruby na tym samym komputerze - a prawdopodobnie nie masz - nie używaj rbenv / rvm. Ich „abstrakcja” nie jest darmowa; Gwarantuję, że w pewnym momencie będziesz musiał poświęcić czas na ich debugowanie. Moja rada: po prostu zainstaluj Rubiego za pomocą menedżera pakietów systemu operacyjnego. Najnowsze jest najlepsze.
pje
6
Czy coś mi brakuje? Bundler nadal domyślnie próbuje instalować pakiety w całym systemie.
detly
6
W nowoczesnym przepływie pracy środowiska izolowane nie są w zasadzie opcjonalne. Jeśli polegasz na systemie Ruby i systemowym menedżerze pakietów, nie masz ŻADNYCH gwarancji, że Twoje instalacje będą powtarzalne, a to cię ugryzie w twarz w czasie wdrażania. Od kursu będziesz sporadycznie ugrzęznąć walcząc z potworem instalacji. To też dobra rzecz. Ponieważ rozwiązujesz problemy w swoim środowisku deweloperskim, więc nigdy nie musisz ich rozwiązywać w swoim środowisku na żywo. Powtarzam, jeśli otrzymujesz wynagrodzenie za kod, nigdy nie korzystaj ze środowiska systemowego. Używaj izolowanego środowiska, ze względu na zdrowie psychiczne.
Shayne
19

Wydaje się, że nikt nie wspomniał o rbenv .

Xuan
źródło
rbenv jest menedżerem ruby, ale na poziomie pakietu (odpowiednik virtualenv) nie oferuje natywnie menedżera gemset, który mógłby zaoferować wirtualny środowisko.
yekta
16

Myślę, że polubisz piaskownicę .

dylanfm
źródło
9
O cholera, to przepisuje $HOME?! Co to do cholery ma perełki trzeba , że dla? Smutne jest to, że to najlepsza rzecz, jaką widziałem w tej pracy. Nawet bundler domyślnie instaluje w systemowej ścieżce ruby.
Chris R
6
sandbox nie był aktualizowany od ~ 4 lat (ostatnie zatwierdzenie miało miejsce w grudniu 2008 r.), RVM jest nadal w aktywnym rozwoju (ostatnie zatwierdzenie było wczoraj)
dbr
16

Wspomnę o tym, jak robię to z Bundlerem (którego używam z RVM - RVM do zarządzania rubinami i domyślnym zestawem globalnych klejnotów, Bundler do obsługi klejnotów specyficznych dla projektu)

bundler install --binstubs --path vendor

Uruchomienie tego polecenia w katalogu głównym projektu będzie zainstalować perełki wymienione z Gemfile, umieścić w bibliotekami ./vendororaz wszelkie wykonywalne w ./bini wszystkie requires (jeśli używasz bundle consolelub Bundler wymaga) będą odnosić te EXE i bibliotekami.

Pracuje dla mnie.

iain
źródło
Mała wskazówka dla osób korzystających z macOS: jeśli vendor.noindexnazwiesz ścieżkę, Twoje wyszukiwania Spotlight nie będą zaśmiecone danymi zindeksowanymi ze sprzedawanych klejnotów.
innymi
1
To też robię (z rbenv, ale to już inna historia), ponieważ izoluje zestaw gemset i wersję rubinową. Nic nie jest instalowane w całym systemie, a każdy projekt ma dobrze zadeklarowane zależności. Wskazówka: bundle config path vendornigdy nie zapomnij tego argumentu.
nandilugio
15

Jeśli potrzebujesz tylko zainstalować klejnoty jako użytkownik inny niż root, spróbuj ustawić GEM_HOMEzmienną środowiskową. Potem po prostu biegnij gem.

Na przykład:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
mpb
źródło
Niesamowite! W systemie OSX ten folder jest ukryty:export GEM_HOME=$HOME/.local/gems
Bruno
1
Może być łatwiejszy w użyciu, GEM_HOME=$HOME/.localwięc udostępnia ten sam .binfolder. W takim przypadku nie musimy aktualizować naszej $PATHzmiennej.
Bruno
Zdecydowanie najczystsze podejście bez zależności, jakie widziałem, do instalowania narzędzi, które nie psują się nawzajem po aktualizacji (pozostało tylko dodanie aliasu w twoim ~/.bashrci gotowe). +1
Paradoxis
4

Polecam direnv . Jest to przełącznik środowiska dla powłoki.

Przed każdym monitem sprawdza istnienie pliku „.envrc” w katalogu bieżącym i nadrzędnym. Jeśli plik istnieje (i jest autoryzowany), jest ładowany do podpowłoki bash, a wszystkie wyeksportowane zmienne są następnie przechwytywane przez direnv, a następnie udostępniane bieżącej powłoce.

Oto jak używać direnv z ruby-install

+ ruby-install

Dodaj to do ~/.direnvrc

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

Zainstaluj ruby-install ( brew install ruby-install) i zainstaluj kilka rubinów.

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

Następnie zrób kilka linków symbolicznych dla wygody:

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

I wreszcie w każdym projekcie .envrc:

use ruby 2.0

Spowoduje to umieszczenie wszystkich klejnotów w katalogu projektu .direnv/ruby(ułatwi to otwieranie klejnotów). bundler umieści pliki binarne opakowania .direnv/bin(nie więcej bundle exec!).

+ rbenv

Możliwe jest również użycie rbenv, dodając use rbenvpolecenie w dowolnym .envrcpliku. Spowoduje to aktywację rbenv, który z kolei umieści opakowania ruby ​​w PATH.

Zauważ, że nie jest konieczne instalowanie rbenv w .bashrc lub .zshrc, aby to zadziałało.

+ RVM

Oto najbardziej skomplikowany plik .envrc, którego używam w projektach Ruby:

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

rvm służy do wyboru odpowiedniej wersji ruby

polecenia układu automatycznie ustawiają niektóre zwykłe zmienne środowiskowe. Na razie istnieje tylko układ rubinowy. To, co robi, to ustawienie zmiennej środowiskowej GEM_HOME i jej katalogu bin na twoją ścieżkę. Ponieważ zależy to od wersji ruby, pamiętaj, aby wywołać ją po "rvm". Ponieważ każdy katalog układu ruby ​​ma swój własny GEM_HOME, nie musisz używać gemsetów rvm.

PATH_add poprzedza i rozwija podaną ścieżkę względną. W takim przypadku używam tego do oddzielenia binstubs bundlerów od moich własnych skryptów bin z plikamibundle install --binstubs .direnv/bundler-bin

Jeśli chcesz się dowiedzieć, co dokładnie robią te polecenia, na razie: cat direnv stdlib| mniej

Shin Kim
źródło
2
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest zawrzeć tutaj zasadnicze części odpowiedzi i podać link do odniesienia. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
jezrael
@ jezrael Dziękujemy za komentarz!
Shin Kim,
1
Super, nie ma problemu.
jezrael
1

Mineshaft to projekt, nad którym pracuję od jakiegoś czasu i nad którym kontynuuję prace rozwojowe.

Oferuje możliwość tworzenia środowisk wirtualnych podobnych do tego, jak działa virtualenv, a także umożliwia globalną instalację Rubiego.

ctesterman
źródło