TL; DR
- ジェムセットを気にしないでください。複数のバージョンのgemを同時にインストールできます。
$ gem-based-binary _version_ args
必要に応じて、表記を使用して実行するバージョンを指定します。bundle exec
バージョンを指定するGemfileがある場合に使用します。
gem install rails -v 3.2.13
rails _3.2.13_ new Project2
cd Project2
bundle exec rails server
更新: 2015-06-04
私は3年前にこの質問を書きました。一部は誤った仮定に基づいており、一部はそれ以来状況が変化しています。@indirectの元の回答に感謝し、上記で要約した@kelvinの新しい(あまり賛成されていない)回答に注意を向けたいと思います。
私の誤った仮定:一度にインストールできるgemのバージョンは1つだけであるため、名前空間を分離するためにgemsetが必要です。違います。gemの複数のバージョンを同時にインストールできます。bundle exec
バージョン制約を指定するGemfileがあり、を介してコマンドを呼び出すか、最初の引数としてバージョンを指定しない限り、コマンドラインから呼び出されるときに最新のものが使用されます。
コマンドラインから古いバージョンのgemを呼び出すにはどうすればよいですか?も参照してください。re:アンダースコアバージョン表記。
元の質問:
Railsの異なるバージョンを使用して進行中の複数のプロジェクトがあります。特定のバージョンのレールを使用してプロジェクトを作成し、プロジェクトを相互に分離しておくためのワークフロー(以下で説明)があります。他のワークフロー、特にRVMの代わりにrbenvを使用して実験したいのですが、その方法が明確ではありません。
質問: rbenv-gemsetやrvmではなく、rbenvとbundlerを使用する場合に、それぞれが異なるバージョンのrailsを使用する複数のrailsプロジェクトを作成するための現在のベストプラクティス は何ですか?
ユースケース: ProjectAとProjectBという2つのレールプロジェクトがあります。ProjectAは1つのバージョンのRails( "RailsA")を使用して開発されていますが、ProjectBは別のバージョン( "RailsB")を使用しています。両方のバージョンをインストールするにはどうすればよいですか?
GEMSETSのアプローチ: Railsの開発を始めたとき、私はRVMを使用していました。RVMは、rubyの複数の同時インストールをサポートすることに加えて、複数のNamedGemセットを持つことをサポートします。各プロジェクトには、gemsetと呼ばれる独自のgemのコレクション(レール自体を含む)があります。
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
注:スケルトンファイルはバージョンごとに異なるため、プロジェクトフォルダーの作成は、目的のバージョンのrailsrails new
を使用するコマンドで実行する必要があります(IMHO) 。(おそらく私はこの前提を再検討する必要がありますか?)
バンドルアプローチ: RVMの代わりにrbenvを使用して遊んでいますが、ワークフローを明確に理解していません。README.mdの中で、Sam Stephensonは、「rbenvは... gemsetを管理しません。Bundlerは、アプリケーションの依存関係を管理するためのより良い方法です」と書いています。rvmのgemsetと同じ結果を得るためのプラグイン(rbenv-gemset )がありますが、Samは明らかに代わりにBundlerを使用することを好みます。残念ながら、彼はワークフローがどのようになるかについて詳しく説明していません。BundlerのWebサイトでさえ、あるプロジェクトを別のプロジェクトから分離する方法のすべての点を明示的に結び付けているわけではありません。いくつかのブログ と 要点~/.bundle/config
が助けになり、次のファイルを提案しています。
---
BUNDLE_PATH: vendor/bundle
(ところで、「---」が何であるかはわかりません。ドキュメントにはそれについての言及がなく、違いはないようです。)
これにより、各レールプロジェクトに独自のジェムセットが効果的に提供され、ジェムがProjectX / vendor /bundle/に保存されます。実際、レール自体はそこに(再)インストールされ、実行すると、プロジェクトは他の環境から完全に独立しますbundle install
。
しかし、部屋の中の象は、そもそもレールプロジェクトフォルダを作成するという鶏が先か卵が先かという問題です!! RailsAを使用してProjectAフォルダーを作成するには、最初にRails(およびその多数の依存関係)をインストールする必要があります。ただし、ProjectBを作成する場合は、RailsBの使用に切り替える必要があります。ジェムセットがなければ、深刻なアップグレード/ダウングレードを行う必要があります。クールではありません。
考えられる解決策は、ProjectXフォルダーの作成に使用するRailsのバージョンを気にしないことです。次に、rails 3.0を使用して3.2プロジェクトを作成すると、アプリ/アセットツリーを手動で作成できます。しかし、それは私を苛立たせます。より良い方法はありませんか?