Je suis intéressé par la façon dont RVM et RBEnv fonctionnent réellement. Évidemment, ils échangent entre différentes versions de Ruby et de gemsets, mais comment cela se passe-t-il? J'avais supposé qu'ils mettaient simplement à jour les liens symboliques, mais après avoir fouillé le code (et je dois admettre que ma connaissance de Bash est superficielle), ils semblent faire plus que cela.
Réponses
Trop de publicités?Petite explication: rbenv fonctionne en interférant dans votre environnement PATH
. Le concept est simple, mais le diable est dans les détails; un exposé complet ci-dessous.
Tout d'abord, rbenv crée des cales pour toutes les commandes (ruby
, irb
, rake
, gem
et ainsi de suite) sur l'ensemble de vos versions installées de Ruby. Ce processus est appelé ressasser. Chaque fois que vous installez une nouvelle version de Ruby ou installer un joyau qui fournit une commande, exécutez rbenv rehash
assurez-vous que les nouvelles commandes sont calée.
Ces cales en direct, dans un seul répertoire (~/.rbenv/shims
par défaut). Pour utiliser rbenv, il vous suffit d'ajouter les rondelles de répertoire à l'avant de votre PATH
:
export PATH="$HOME/.rbenv/shims:$PATH"
Ensuite, chaque fois que vous exécutez ruby
à partir de la ligne de commande, ou d'exécuter un script dont le shebang lectures #!/usr/bin/env ruby
, votre système d'exploitation trouverez ~/.rbenv/shims/ruby
de la première et de l'exécuter au lieu de toute autre ruby
fichier exécutable que vous avez installé.
Chaque cale est un petit script Bash qui exécute à son tour rbenv exec
. Donc, avec rbenv dans votre chemin d'accès, irb
est équivalent à rbenv exec irb
, et ruby -e "puts 42"
est équivalent à rbenv exec ruby -e "puts 42"
.
L' rbenv exec
commande chiffres de la version de Ruby que vous souhaitez utiliser, puis exécute la commande correspondante pour cette version. Voici comment:
- Si l'
RBENV_VERSION
variable d'environnement est définie, sa valeur détermine la version de Ruby à utiliser. - Si le répertoire de travail actuel a un
.rbenv-version
le fichier, son contenu est utilisé pour définir l'RBENV_VERSION
variable d'environnement. - Si il n'y a pas d'
.rbenv-version
le fichier dans le répertoire courant, rbenv recherche dans chaque répertoire parent pour un.rbenv-version
le fichier jusqu'à ce qu'il frappe à la racine de votre système de fichiers. Si l'on est trouvé, son contenu est utilisé pour définir l'RBENV_VERSION
variable d'environnement. - Si
RBENV_VERSION
n'est toujours pas établie, rbenv essaie de les régler en utilisant le contenu de l'~/.rbenv/version
le fichier. - Si aucune version n'est spécifié nulle part, rbenv suppose que vous souhaitez utiliser le "système" Ruby-c'est à dire quelle version serait si rbenv n'étiez pas dans votre chemin.
(Vous pouvez définir un projet spécifique à la version de Ruby avec l' rbenv local
de commande, ce qui crée un .rbenv-version
le fichier dans le répertoire courant. De même, l' rbenv global
commande modifie l' ~/.rbenv/version
le fichier.)
Armé avec un RBENV_VERSION
variable d'environnement, rbenv ajoute ~/.rbenv/versions/$RBENV_VERSION/bin
à l'avant de votre PATH
, alors execs de la commande et les arguments passés à l' rbenv exec
. Voila!
Pour un regard approfondi sur exactement ce qui se passe sous le capot, essayez de configurer RBENV_DEBUG=1
et l'exécution d'un Rubis de commande. Chaque commande Bash qui rbenv s'exécute sur votre terminal.
Maintenant, rbenv est juste une question de faire passer les versions, mais l'essor de l'écosystème de plugins va vous aider à tout faire à partir de l'installation de Ruby à la configuration de votre environnement, la gestion des "gemsets" et même l'automatisation bundle exec
.
Je ne suis pas tout à fait sûr de ce que le support IRC est de faire passer les versions Rubis, et rbenv est conçu pour être simple et assez compréhensible de ne pas avoir besoin de soutien. Mais si vous avez besoin d'aide, le problème de tracker et Twitter sont juste un couple de clics.
Divulgation: je suis l'auteur de rbenv, ruby-construire, et rbenv-vars.
J'ai écrit un article de fond: http://niczsoft.com/2011/11/what-you-should-know-about-rbenv-and-rvm/
La différence de base est où la coquille de l'environnement est modifié:
- RVM: il est modifié lorsque vous changez de Ruby.
- rbenv: il est modifié lorsque vous exécutez un Rubis/gem exécutable.
Aussi, la chose à propos de RVM est, il couvre beaucoup plus que juste de la gestion de Rubis, il a beaucoup plus que n'importe quel autre outil (il y en a d'autres en dehors de RVM et rbenv: https://twitter.com/#!/mpapis/statut/171714447910502401)
Ne pas oublier l'instant de soutien que vous obtenez sur l'IRC dans le #"rvm" de canal sur la Freenode serveurs.
Donc, pour résumer les excellentes réponses ci-dessus, la principale différence pratique entre RVM et rbenv, c'est quand la version de Ruby est sélectionné.
rbenv:
rbenv ajoute une cale pour le début de votre chemin d'accès, une commande portant le même nom que le Rubis. Lorsque vous tapez ruby
sur une ligne de commande la cale est exécuté à la place (car il est aussi appelé "ruby" et vient en premier dans le chemin d'accès). La cale cherche une variable d'environnement ou d' .rbenv_version
le fichier pour lui dire quelle version de Ruby à délégué à.
RVM:
RVM permet de définir une version de Ruby directement en appelant rmv use
. En outre, il remplace également l' cd
système de commande. Lorsque vous cd
dans un dossier qui contient un .rvmrc
le fichier, le code à l'intérieur de l' .rvmrc
fichier exécuté. Ceci peut être utilisé pour définir une version de Ruby lorsque vous entrez un répertoire, ou quelque chose d'autre que vous voulez.
D'autres différences:
Il y a bien sûr d'autres différences. RVM a gemsets hors de la boîte, tandis que rbenv nécessite juste un peu plus de piratage (mais pas beaucoup). Les deux sont fonctionnelles des solutions à ce problème.
La principale différence semble être quand et comment ruby est sous tension. Ruby est en marche:
- pour RVM manuellement (rvm) ou automatiquement lors du changement de répertoires
- pour rbenv automatiquement à chaque fois qu'un rubis commande est exécutée
RVM s'appuie sur l'modifiés cd
de commande et de sélection manuel de Ruby en rvm use
. rbenv utilise des emballages ou des "cales" pour la base de tous les rubis de commandes que le mécanisme par défaut pour sélectionner le rubis. RVM crée des wrappers pour la ligne de commande de base des outils comme gem, râteau, ruby, trop. Ils sont utilisés par exemple dans les tâches cron ( voir http://rvm.io/integration/cron/ ), mais ils ne sont pas le mécanisme par défaut pour changer la version de Ruby.
Ainsi, les deux méthodes sélectionnez "automatiquement" la bonne version de Ruby, en écrasant les commandes et l'utilisation des wrappers. rvm remplace les commandes du shell, comme un cd. rbenv remplace la base de tous les rubis des commandes telles que le rubis, l'irb, la commission et le gem.
rvm system
env > before
rvm jruby # or whatever
env > after
diff after before
Vous donne à peu près:
< GEM_HOME=$HOME/.gem/ruby/1.9.1
---
> GEM_HOME=$HOME/.rvm/gems/jruby-1.6.6
< GEM_PATH=$HOME/.gem/ruby/1.9.1
---
> GEM_PATH=$HOME/.rvm/gems/jruby-1.6.6:$HOME/.rvm/gems/jruby-1.6.6@global
*bunch of rvm_*
> MY_RUBY_HOME=$HOME/.rvm/rubies/jruby-1.6.6
> RUBY_VERSION=jruby-1.6.6
> IRBRC=$HOME/.rvm/rubies/jruby-1.6.6/.irbrc
Et il ajoute:
$HOME/.rvm/gems/jruby-1.6.6/bin:$HOME/.rvm/gems/jruby-1.6.6@global/bin
à $PATH