139 votes

Comment RVM et RBEnv fonctionnent-ils?

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.

241voto

Sam Stephenson Points 2242

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:

  1. Si l' RBENV_VERSION variable d'environnement est définie, sa valeur détermine la version de Ruby à utiliser.
  2. 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.
  3. 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.
  4. Si RBENV_VERSION n'est toujours pas établie, rbenv essaie de les régler en utilisant le contenu de l' ~/.rbenv/version le fichier.
  5. 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.

18voto

mpapis Points 32015

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.

15voto

superluminary Points 5496

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.

6voto

0x4a6f4672 Points 4986

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.

5voto

Reactormonk Points 7990
 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X