Ruby équivalent de virtualenv?

165

Existe-t-il quelque chose de similaire à l'utilitaire Python virtualenv ?

Fondamentalement, il vous permet d'installer des packages Python dans un environnement sandbox, donc easy_install djangone va pas dans votre répertoire site-packages à l'échelle du système, il irait dans le répertoire créé par virtualenv.

Par exemple:

$ 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

Y a-t-il quelque chose comme ça pour RubyGems?

dbr
la source

Réponses:

85

RVM fonctionne plus près du fonctionnement de virtualenv car il vous permet de bac à sable différentes versions de ruby ​​et leurs gemmes, etc.

Van Nguyen
la source
5
J'ai essayé le bac à sable et le RVM et je pense que RVM est une bien meilleure solution.
ivanjovanovic
9
ivanjovanovic. Pourquoi avez-vous trouvé RVM meilleur que le bac à sable?
pwan
68

Ni sandbox, ni RVM, ni rbenv ne gèrent les versions des dépendances gem de votre application. L'outil pour cela est bundler .

  • utilisez un Gemfile comme déclaration de dépendance de votre application
  • utiliser bundle installpour installer des versions explicites de ces dépendances dans un emplacement isolé
  • utiliser bundle execpour exécuter votre application
pje
la source
6
Aussi, personnellement, je pense que les gens abusent de rbenv / rvm. Si vous n'avez pas absolument besoin d'avoir plusieurs versions isolées de ruby ​​sur la même machine - et ce n'est probablement pas le cas - n'utilisez pas rbenv / rvm. Leur «abstraction» n'est pas gratuite; Je vous garantis que vous devrez passer du temps à les déboguer à un moment donné. Mon conseil: installez simplement ruby ​​avec le gestionnaire de paquets de votre système d'exploitation. Le plus récent est le meilleur.
pje
6
Est-ce que je manque quelque chose? Bundler essaie toujours d'installer les packages à l'échelle du système par défaut.
detly le
6
Les environnements isolés sont quasiment non facultatifs dans un flux de travail moderne. Si vous comptez sur le système ruby ​​et le gestionnaire de packages système, vous n'avez AUCUNE garantie que vos installations seront répétables et cela vous mordra au visage au moment du déploiement. Bien sûr, vous vous enliserez parfois en combattant le monstre d'installation. C'est aussi une bonne chose. Parce que vous résolvez les problèmes dans votre environnement de développement afin de ne jamais avoir à les résoudre dans votre environnement réel. Pour répéter, si vous êtes payé au code, n'utilisez jamais l'environnement système. Utilisez un environnement isolé, pour des raisons de santé mentale.
Shayne
19

Personne ne semble avoir mentionné rbenv .

Xuan
la source
rbenv est un gestionnaire ruby, mais au niveau du package (l'équivalent de virtualenv), il n'offre pas nativement un gestionnaire de gemset pour pouvoir offrir un env virtuel.
yekta
16

Je pense que vous aimerez le bac à sable .

dylanfm
la source
9
Putain de merde, qui réécrit $HOME?! Pourquoi les gemmes ont-elles besoin de ça ? Le plus triste, c'est que c'est la meilleure chose que j'ai vue pour le poste. Même le bundler s'installe par défaut dans le chemin ruby ​​du système.
Chris R
6
sandbox n'a pas été mis à jour depuis ~ 4 ans (le dernier commit date de décembre 2008), RVM est toujours en développement actif (le dernier commit date d'hier)
dbr
16

Je vais mentionner la façon dont je fais cela avec Bundler (que j'utilise avec RVM - RVM pour gérer les rubis et un ensemble par défaut de gemmes globales, Bundler pour gérer les gemmes spécifiques au projet)

bundler install --binstubs --path vendor

L'exécution de cette commande à la racine d'un projet installera les gemmes répertoriées à partir de votre Gemfile, insérera les bibliothèques, ./vendoret tous les exécutables dans ./binet all requires (si vous utilisez bundle consoleou si le Bundler l'exige) référencera ces ex et bibliothèques.

Travaille pour moi.

iain
la source
Un petit conseil pour ceux sur macOS, si vous nommez le chemin, vendor.noindexvos recherches Spotlight ne seront pas encombrées de données indexées à partir des gemmes vendues.
iain
1
C'est ce que je fais aussi (avec rbenv, mais c'est une autre histoire), car il isole le jeu de pierres précieuses et la version rubis. Rien n'est installé à l'échelle du système et chaque projet a toutes ses dépendances bien déclarées. Astuce: utilisez bundle config path vendorpour ne jamais oublier cet argument.
nandilugio
15

Si vous avez seulement besoin d'installer des gemmes en tant que non-root, essayez de définir la GEM_HOMEvariable d'environnement. Alors courez gem.

Par exemple:

$ export GEM_HOME=$HOME/local/gems
$ gem install rhc
mpb
la source
Impressionnant! Sous OSX, ce dossier est masqué:export GEM_HOME=$HOME/.local/gems
Bruno
1
Il peut être plus facile à utiliser GEM_HOME=$HOME/.localafin de partager le même .bindossier. Dans ce cas, nous n'avons pas à mettre à jour notre $PATHvariable.
Bruno
De loin, l'approche sans dépendances la plus propre que j'ai jamais vue pour installer des outils qui ne se cassent pas lorsqu'ils sont mis à jour (tout ce qui reste est d'ajouter un alias dans votre ~/.bashrcet vous avez terminé). +1
Paradoxis
4

Je recommande direnv . C'est un sélecteur d'environnement pour le shell.

Avant chaque invite, il vérifie l'existence d'un fichier ".envrc" dans les répertoires courant et parent. Si le fichier existe (et autorisé), il est chargé dans un sous-shell bash et toutes les variables exportées sont alors capturées par direnv puis rendues disponibles le shell actuel.

Voici comment utiliser direnv avec ruby-install

+ ruby-installer

Ajoutez ceci à la ~/.direnvrc

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

Installez ruby-install ( brew install ruby-install) et installez un tas de rubis.

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

Et puis créez quelques liens symboliques pour plus de commodité:

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

Et enfin dans n'importe quel projet .envrc:

use ruby 2.0

Cela placera toutes les gemmes dans le .direnv/rubyrépertoire du projet (facilite l'ouverture des gemmes). bundler placera les binaires wrapper .direnv/bin(pas plus bundle exec!).

+ rbenv

Il est également possible d'utiliser rbenv en ajoutant la use rbenvcommande dans n'importe quel .envrcfichier. Cela activera rbenv qui à son tour placera les enveloppes ruby ​​dans le PATH.

Notez qu'il n'est pas nécessaire d'installer rbenv dans le .bashrc ou .zshrc pour que cela fonctionne.

+ RVM

Voici le .envrc le plus compliqué que j'utilise sur les projets ruby:

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

rvm est utilisé pour sélectionner la bonne version de ruby ​​pour vous

Les commandes de mise en page définissent automatiquement certaines des variables d'environnement habituelles. Pour l'instant, seule la mise en page ruby ​​existe. Ce qu'il fait, c'est définir la variable d'environnement GEM_HOME et son répertoire bin sur votre chemin. Comme cela dépend de la version ruby, assurez-vous de l'appeler après "rvm". Puisque chaque répertoire de mise en page ruby ​​a son propre GEM_HOME, vous n'avez pas besoin d'utiliser les gemsets de rvm.

PATH_add ajoute et développe le chemin relatif donné. Dans ce cas, j'utilise ceci pour séparer les binstubs du bundler de mes propres scripts bin avecbundle install --binstubs .direnv/bundler-bin

Si vous voulez savoir ce que font exactement ces commandes, pour l'instant: cat direnv stdlib| Moins

Shin Kim
la source
2
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses aux liens uniquement peuvent devenir invalides si la page liée change. - De l'avis
jezrael
@ jezrael Merci pour votre commentaire!
Shin Kim le
1
Super, pas de problème.
jezrael le
1

Mineshaft est un projet sur lequel je travaille depuis un certain temps et sur lequel je continue le travail de développement.

Il offre la possibilité à la fois de créer des environnements virtuels similaires au fonctionnement de virtualenv et peut également installer Ruby à l'échelle mondiale.

ctesterman
la source