45

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ではなく、rbenvbundlerを使用する場合に、それぞれが異なるバージョンの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プロジェクトを作成すると、アプリ/アセットツリーを手動で作成できます。しかし、それは私を苛立たせます。より良い方法はありませんか?

4

3 に答える 3

42

ほとんどの人は、最初にレールジェムをインストールすることでこれを解決しgem install railsます。何らかの理由でそれを拒否した場合は、Railsが自動的に行うバンドルをオプトアウトできます。これは、ルビー管理システムに関係なく完全に機能します。

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

プロンプトが表示されたら、「y」と入力して、GemfileをデフォルトのRailsファイルに置き換えます(または、必要に応じて置き換えません)。次に、それが完了したら:

bundle install

これで、Rails GemをRubyGemにインストールせずに、選択したバージョンで新しいRailsアプリをブーストラップしました。

于 2012-03-20T16:39:38.230 に答える
12

rails 3.1.0がインストールされているが、インストールされていないrails3.2.13を使用して新しいプロジェクトを作成するとします。

新しいプロジェクトをに入れたいとしましょう~/projects/Project2

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

これによりGemfile、コマンドラインで指定したバージョンのレールにロックされたが作成されます。

すべてのgemを1つの場所にインストールするというBundlerの哲学に反するため、新しいプロジェクト用にgemの個別のコピーを保持するというアイデアを意図的に省略しました。Railsを実行すると、Bundlerはその中央の場所から正しいgemバージョンを自動的に選択します。つまり、プロジェクトは、それ自体に新しいコピーをインストールする代わりに、gemを共有できます。(ただし、インストールするrubyの各バージョンには、独自のgemがあることに注意してください。ネイティブ拡張機能はrubyバージョン間で機能しない可能性があるため、これは良いことです。)

rakeのようなほとんどのコマンドは、インストールした最新バージョンをロードするため、もう少し注意するrake必要があります。bundle exec rake ...正しいバージョンがロードされていることを確認するために実行する必要があります。通常、をbundle exec除くすべてのコマンドに対して実行しますrails。エイリアスを作成して短くすることができます(私はを使用しますbex)。gem実行可能ファイルでこれを自動化するには、rbenv-binstubsを使用できますが、Gemfileのような非gem実行可能ファイルを実行するrubyirb、Gemfileが自動的に使用されないことに注意する必要があります。

補足rails newが実行さbundle installれ、依存関係の最新バージョンがチェックされます。依存関係の要件を満たす現在インストールされているgemをbundlerで使用できるようにする場合は、bundle installwithをスキップして、アプリディレクトリでrails new --skip-bundle実行できます。bundle check

補足2:Project2にデフォルト(例:2.3.0)とは異なるルビーバージョン(例:2.1.8)を使用したいとします。その場合、gem install上記のように実行すると、2.3.0でgemがインストールされます。これは、2.1.8でgemを再度インストールする必要があるため、時間の無駄です。この問題を解決するために、環境変数を介してコマンドに優先バージョンを使用させることができます。

RBENV_VERSION=2.1.8  gem install rails -v 3.2.13
cd ~/projects
RBENV_VERSION=2.1.8  rails _3.2.13_ new Project2
echo 2.1.8 > Project2/.ruby-version

変数を設定するために使用できますが、そのシェルの期間中、ファイルにrbenv shell基づいてrbenvを自動切り替えしたくない場合にのみお勧めします。.ruby-version変数が設定されていることを忘れがちです。別のプロジェクトにcdすると、期待するバージョンが使用されなくなります。

于 2013-09-24T16:47:32.980 に答える
8

gemsets /bundlerのトピックに関する最近の良い投稿がここにありますhttp://rakeroutes.com/blog/how-to-use-bundler-instead-of-rvm-gemsets/rbenvセットアップに適用できる優れた背景。

于 2012-03-27T21:30:43.110 に答える