43 votes

Rbenv: Survivre sans pierres précieuses

J'ai plusieurs projets en cours sur l'utilisation des différentes versions de Rails. J'ai un flux de travail (décrit ci-dessous) pour la création de projets à l'aide des versions spécifiques de rails, et en gardant les projets isolés les uns des autres. J'aimerais expérimenter avec d'autres flux de travail, en particulier, à l'aide de rbenv au lieu de RVM, mais il n'est pas clair comment le faire.

QUESTION: Quelle est la meilleure pratique pour la création de plusieurs rails des projets, chacun utilisant une autre version de rails, lors de l'utilisation de rbenv et bundler, par opposition à rbenv sertie ou rvm?

CAS d'UTILISATION: j'ai deux rails de projets, appelé ProjectA et Projetb. ProjectA est développé en utilisant une version de rails ("RailsA"), alors que Projetb utilise une version différente ("RailsB"). Comment puis-je gérer les avoir les deux versions?

LE GEMSETS APPROCHE: Lorsque j'ai commencé avec les Rails du développement, j'ai utilisé RVM. En plus de soutenir de multiples installations simultanées de ruby, RVM prise en charge de plusieurs Nommée Gem Jeux. Chaque projet a sa propre collection de bijoux (y compris les rails lui-même), appelé sertie:

rvm gemset create RailsA
rvm gemset use RailsA
# RailsA.  Note: My question is not version-specific.
gem install rails --version 3.0
rails new ProjectA
cd ProjectA
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install
cd ..
## Now do the same for ProjectB
rvm gemset create RailsB
rvm gemset use RailsB
gem install rails --version 3.2
rails new ProjectB
cd ProjectB
rvm --rvmrc use `rvm current`
vi Gemfile
bundle install

Remarque: La création des dossiers de projet doit être fait (à mon humble avis) par un rails new commande à l'aide de la version souhaitée de rails, depuis les fichiers du squelette changement de version en version. (Peut-être que je devrais revoir cette prémisse?)

LE BUNDLER APPROCHE: j'ai joue avec l'aide de rbenv au lieu de RVM, mais je ne comprends pas le flux de travail aussi bien. Dans le fichier README.md, Sam Stephenson, écrit que "les rbenv ne ... gérer gemsets. Bundler est une meilleure façon de gérer les dépendances de l'application." Il y a un plugin (rbenv sertie) pour obtenir les mêmes résultats que rvm est gemsets, mais Sam clairement faveurs à l'aide de la Fagoteuse à la place. Malheureusement, il ne m'étendrai pas sur ce que le flux de travail devrait ressembler. Même le Bundler site web n'est pas explicitement connecter tous les points de façon à isoler un projet à partir d'un autre. Plusieurs blogs et gist venir à la rescousse, ce qui suggère la suivante ~/.bundle/config le fichier:

---
BUNDLE_PATH: vendor/bundle

(BTW, je ne suis pas sûr de ce que l' "---" est d'environ. Les docs ne font aucune mention de celui-ci et il ne semble pas faire une différence.)

Effectivement cela donne à chaque rails de projet de sa propre sertie, le stockage des gemmes dans ProjectX/vendor/bundle/. En fait, rails lui-même sera (re-)y est installé, ce qui rend le projet complètement indépendant du reste de mon environnement, une fois que j'exécute bundle install.

Mais l' éléphant dans la pièce est le dilemme de la poule et de l'oeuf problème de la création de l'rails dossier du projet dans la première place! Afin de créer le ProjectA dossier à l'aide de RailsA, j'ai besoin d'installer des rails (et ses nombreuses dépendances) d'abord. Mais lorsque je veux créer Projetb, je dois alors passer à l'utilisation de RailsB. Sans gemsets, je dois faire un peu de sérieux de valorisation/dévalorisation. Pas cool.

Une solution possible est tout simplement pas à se soucier de la version de rails-je utiliser pour créer le ProjectX dossier. Si je puis utiliser des rails 3.0 pour créer un 3.2 projet, je pourrais créer manuellement le dossier app/assets arbre. Mais cela ne m'irrite. N'est-ce pas là une meilleure façon?

42voto

indirect Points 1910

La plupart des gens à résoudre ce problème en installant le gem rails d'abord via gem install rails. Si vous refuser de le faire pour une raison quelconque, vous pouvez choisir de refuser le regroupement automatique qui Rails de tentatives pour le faire pour vous. Ce sera quel que soit votre ruby système de gestion.

mkdir myapp
cd myapp
echo "source :rubygems" > Gemfile
echo "gem 'rails', '3.2.2'" >> Gemfile
bundle install --path vendor/bundle
bundle exec rails new . --skip-bundle

Lorsque vous y êtes invité, tapez "y" pour remplacer votre Gemfile avec les Rails par défaut un (ou pas, comme vous préférez). Ensuite, une fois que c'est fait:

bundle install

Vous avez terminé, et vous avez boostrapped une nouvelle application rails avec la version de votre choix sans avoir à installer le gem rails en rubygems.

12voto

Kelvin Points 5810

Supposons que vous avez des rails de 3.1.0 installé, mais vous souhaitez créer un nouveau projet à l'aide de rails 3.2.13 qui n'est pas installé.

Disons que vous voulez que le nouveau projet soit en ~/projects/Project2.

gem install rails -v 3.2.13
cd ~/projects
rails _3.2.13_ new Project2

Cela va créer de l' Gemfile pour vous, enfermé à la version de rails que vous avez spécifié sur la ligne de commande.

J'ai volontairement omis l'idée de garder une copie distincte de gemmes pour le nouveau projet, parce que cela va à l'encontre de la Fagoteuse de la philosophie, qui est d'avoir toutes les gemmes installée dans un endroit. Lorsque vous exécutez rails, Bundler va choisir le bon bijou versions automatiquement à partir de cet emplacement central. Cela signifie qu'un projet peut partager des gemmes au lieu d'installer une nouvelle copie de lui-même. (Notez, cependant, que chaque version de ruby, vous installer a ses propres pierres précieuses. C'est une bonne chose parce que les extensions ne sera probablement pas le travail à travers les versions rubis.)

Vous n'avez pas à être un peu plus conscient, parce que la plupart des commandes, comme rake, va charger la version la plus récente de l' rake. Vous aurez besoin pour exécuter bundle exec rake ... assurez-vous que la version correcte est chargé. Habituellement, je vais courir bundle exec pour toutes les commandes sauf rails. Vous pouvez créer un alias pour faire plus court (j'utilise bex).

Note: rails new sera exécuté bundle install, qui va vérifier pour la version la plus récente des dépendances. Si vous voulez bundler à essayer de l'utiliser actuellement installés gemmes qui satisfont aux exigences de dépendance, vous pouvez ignorer l' bundle install avec rails new --skip-bundle, puis exécutez bundle check dans l'app dir.

8voto

Max Points 126

Il y a un bon article récent sur exactement le sujet des gemsets / bundler ici http://rakeroutes.com/blog/how-to-use-bundler-instead-of-rvm-gemsets/ Bon contexte que vous pouvez appliquer à votre configuration rbenv.

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