Breve spiegazione: rbenv funziona collegandosi al proprio ambiente PATH
. Il concetto è semplice, ma il diavolo è nei dettagli; scoop completo di seguito.
In primo luogo, rbenv crea spessori per tutti i comandi ( ruby
, irb
, rake
, gem
e così via) su tutti i tuoi versioni installate di Ruby. Questo processo si chiama rehashing . Ogni volta che installi una nuova versione di Ruby o installi una gemma che fornisce un comando, esegui rbenv rehash
per assicurarti che tutti i nuovi comandi vengano sottoposti a shim.
Questi spessori vivono in una singola directory ( ~/.rbenv/shims
per impostazione predefinita). Per usare rbenv, devi solo aggiungere la directory shims nella parte anteriore del tuo PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Quindi ogni volta che esegui ruby
dalla riga di comando o esegui uno script il cui shebang legge #!/usr/bin/env ruby
, il tuo sistema operativo lo troverà per ~/.rbenv/shims/ruby
primo ed eseguirà invece di qualsiasi altro ruby
eseguibile che potresti aver installato.
Ogni shim è un minuscolo script di Bash che a sua volta viene eseguito rbenv exec
. Quindi, con rbenv nel tuo percorso, irb
è equivalente a rbenv exec irb
ed ruby -e "puts 42"
è equivalente a rbenv exec ruby -e "puts 42"
.
Il rbenv exec
comando determina quale versione di Ruby si desidera utilizzare, quindi esegue il comando corrispondente per quella versione. Ecco come:
- Se la
RBENV_VERSION
variabile di ambiente è impostata, il suo valore determina la versione di Ruby da utilizzare.
- Se la directory di lavoro corrente ha un
.rbenv-version
file, il suo contenuto viene utilizzato per impostare la RBENV_VERSION
variabile di ambiente.
- Se non ci sono
.rbenv-version
file nella directory corrente, rbenv cerca un .rbenv-version
file in ciascuna directory principale fino a quando non raggiunge la radice del filesystem. Se ne viene trovato uno, il suo contenuto viene utilizzato per impostare la RBENV_VERSION
variabile di ambiente.
- Se non
RBENV_VERSION
è ancora impostato, rbenv tenta di impostarlo utilizzando il contenuto del ~/.rbenv/version
file.
- Se nessuna versione viene specificata da nessuna parte, rbenv presume che tu voglia utilizzare il "sistema" Ruby, ovvero qualunque versione verrebbe eseguita se rbenv non fosse sul tuo percorso.
(È possibile impostare una versione di Ruby specifica del progetto con il rbenv local
comando, che crea un .rbenv-version
file nella directory corrente. Allo stesso modo, il rbenv global
comando modifica il ~/.rbenv/version
file.)
Armato di una RBENV_VERSION
variabile d'ambiente, rbenv si aggiunge ~/.rbenv/versions/$RBENV_VERSION/bin
alla parte anteriore del tuo PATH
, quindi esegue il comando e gli argomenti passati a rbenv exec
. Ecco!
Per uno sguardo approfondito esattamente cosa succede sotto il cofano, prova a impostare RBENV_DEBUG=1
ed eseguire un comando Ruby. Ogni comando di Bash eseguito da rbenv verrà scritto sul tuo terminale.
Ora, rbenv si occupa solo di cambiare versione, ma un florido ecosistema di plug-in ti aiuterà a fare di tutto, dall'installazione di Ruby alla configurazione del tuo ambiente , alla gestione dei "gemset" e persino all'automazionebundle exec
.
Non sono sicuro di cosa abbia a che fare il supporto IRC con la commutazione delle versioni di Ruby e rbenv è progettato per essere abbastanza semplice e comprensibile da non richiedere supporto. Ma se hai mai bisogno di aiuto, il tracker dei problemi e Twitter sono solo un paio di clic di distanza.
Divulgazione: sono l'autore di rbenv, ruby-build e rbenv-vars.