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?

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.


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

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 .


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ę .


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.


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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.