Equivalente rubino di virtualenv?


165

Esiste qualcosa di simile all'utilità virtualenv di Python ?

Fondamentalmente ti consente di installare i pacchetti Python in un ambiente sandbox, quindi easy_install djangonon va nella directory dei pacchetti del sito a livello di sistema, andrebbe nella directory creata da virtualenv.

Per esempio:

$ 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'è qualcosa del genere per RubyGems?

Risposte:


84

RVM funziona più vicino a come funziona virtualenv poiché ti consente di sandboxare diverse versioni di rubini e le loro gemme, ecc.


5
Ho provato sia sandbox che RVM e penso che RVM sia una soluzione molto migliore.
Ivanjovanovic,

9
ivanjovanovic. perché hai trovato RVM migliore di sandbox?
pwan,

67

Né sandbox, RVM né rbenv gestiscono le versioni delle dipendenze gemma della tua app. Lo strumento è bundler .

  • utilizzare un Gemfile come dichiarazione di dipendenza dell'applicazione
  • utilizzare bundle installper installare versioni esplicite di queste dipendenze in una posizione isolata
  • utilizzare bundle execper eseguire l'applicazione

6
Inoltre, personalmente penso che le persone abusino di rbenv / rvm. Se non hai assolutamente bisogno di avere versioni multiple e isolate di ruby ​​sullo stesso computer — e probabilmente non lo fai — non usare rbenv / rvm. La loro "astrazione" non viene gratis; Ti garantisco che a un certo punto dovrai dedicare del tempo al loro debug. Il mio consiglio: installa ruby ​​con il gestore dei pacchetti del tuo sistema operativo. L'ultima è la più grande.
pje,

6
Mi sto perdendo qualcosa? Il bundler tenta ancora di installare i pacchetti a livello di sistema per impostazione predefinita.
detenere il

6
Gli ambienti isolati sono praticamente non opzionali in un flusso di lavoro moderno. Se fai affidamento sul sistema ruby ​​e sul gestore dei pacchetti di sistema NON hai garanzie che le tue installazioni saranno ripetibili e che ti morderanno in faccia al momento della distribuzione. Di Naturalmente avrete tanto in tanto impantanarsi combattere il mostro di installazione. Anche questa è una buona cosa. Perché risolvi i problemi nel tuo ambiente di sviluppo in modo da non doverli mai risolvere nel tuo ambiente di vita. Per ripetere, se vieni pagato per il codice non utilizzare mai l'ambiente di sistema. Utilizzare un ambiente isolato, per motivi di sanità mentale.
Shayne,

19

Nessuno sembra aver menzionato rbenv .


rbenv è un gestore ruby, ma a livello di pacchetto (l'equivalente di virtualenv) non offre nativamente un gestore gemset per essere in grado di offrire un ambiente virtuale.
Ekta,

16

Penso che ti piacerà il sandbox .


9
Santa merda, che riscrive $HOME?! Cosa diavolo gemme bisogno che per? La cosa triste è che è la cosa migliore che ho visto per il lavoro. Anche il bundler ha come impostazione predefinita l'installazione nel percorso ruby ​​del sistema.
Chris R,

6
sandbox non è stato aggiornato da ~ 4 anni (l'ultimo commit è stato nel dicembre 2008), RVM è ancora in fase di sviluppo attivo (l'ultimo commit è stato effettuato ieri)
dbr

16

Citerò il modo in cui lo faccio con Bundler (che uso con RVM - RVM per gestire i rubini e un set predefinito di gemme globali, Bundler per gestire gemme specifiche del progetto)

bundler install --binstubs --path vendor

L'esecuzione di questo comando nella radice di un progetto installerà le gemme elencate dal tuo Gemfile, inserirà le librerie ./vendore tutti gli eseguibili in ./bine tutti gli requires (se usi bundle consoleo il Bundler lo richiedono) faranno riferimento a questi ex e librerie.

Per me va bene.


Un piccolo consiglio per quelli su macOS, se dai un nome al percorso le vendor.noindextue ricerche Spotlight non saranno ingombra di dati indicizzati dalle gemme vendute.
Iain

1
Questo è ciò che faccio anch'io (con rbenv, ma questa è un'altra storia), poiché isola il gemset e la versione rubino. Nulla è installato a livello di sistema e ogni progetto ha tutte le sue dipendenze ben dichiarate. Suggerimento: usare per bundle config path vendornon dimenticare mai tale argomento.
nandilugio,

15

Se hai solo bisogno di installare gemme come non root, prova a impostare la GEM_HOMEvariabile d'ambiente. Quindi corri e basta gem.

Per esempio:

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

Eccezionale! Su OSX quella cartella è nascosta:export GEM_HOME=$HOME/.local/gems
Bruno

1
Potrebbe essere più facile da usare, GEM_HOME=$HOME/.localquindi condivide la stessa .bincartella. In tal caso non è necessario aggiornare la nostra $PATHvariabile.
Bruno,


Di gran lunga l'approccio più pulito e senza dipendenze che abbia mai visto per l'installazione di strumenti che non si rompono l'un l'altro durante l'aggiornamento (tutto ciò che rimane è l'aggiunta di un alias nel tuo ~/.bashrce il gioco è fatto). +1
Paradosso,

4

Raccomando direnv . È un commutatore di ambiente per la shell.

Prima di ogni prompt verifica l'esistenza di un file ".envrc" nelle directory corrente e padre. Se il file esiste (e autorizzato), viene caricato in una sub-shell bash e tutte le variabili esportate vengono quindi catturate da direnv e quindi rese disponibili la shell corrente.

Ecco come usare direnv con ruby-install

+ ruby-install

Aggiungi questo a ~/.direnvrc

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

Installa ruby-install ( brew install ruby-install) e installa un mucchio di rubini.

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

E poi crea un paio di symlink per comodità:

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

E infine in qualsiasi progetto .envrc:

use ruby 2.0

Questo metterà tutte le gemme nella .direnv/rubydirectory del progetto (facilita l'apertura delle gemme). il bundler inserirà i binari del wrapper .direnv/bin(non di più bundle exec!).

+ rbenv

È inoltre possibile utilizzare rbenv aggiungendo il use rbenvcomando in qualsiasi .envrcfile. Questo attiverà rbenv che a sua volta inserirà i wrapper ruby ​​nel PERCORSO.

Si noti che non è necessario installare rbenv in .bashrc o .zshrc affinché funzioni.

+ RVM

Ecco il .envrc più complicato che utilizzo nei progetti ruby:

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

rvm viene utilizzato per selezionare la versione ruby ​​giusta per te

i comandi di layout impostano automaticamente alcune delle solite variabili d'ambiente. Per ora esiste solo il layout rubino. Ciò che fa è impostare la variabile d'ambiente GEM_HOME e la sua directory bin sul tuo percorso. Poiché dipende dalla versione ruby, assicurati di chiamarlo dopo "rvm". Poiché ogni directory di layout ruby ​​ha il proprio GEM_HOME, non è necessario utilizzare le gemme di rvm.

PATH_add antepone ed espande il percorso relativo indicato. In tal caso, lo uso per separare i binstub del bundler dai miei script bin conbundle install --binstubs .direnv/bundler-bin

Se vuoi scoprire cosa fanno esattamente quei comandi, per ora: cat direnv stdlib| Di meno


2
Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - Dalla recensione
jezrael,

@jezrael Grazie per il tuo commento!
Shin Kim,

1
Super, nessun problema.
jezrael,

1

Mineshaft è un progetto a cui sto lavorando da un po 'di tempo e sto continuando a lavorare allo sviluppo.

Offre la possibilità sia di creare ambienti virtuali affini a come funziona virtualenv, sia di installare Ruby a livello globale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.