web-dev-qa-db-ja.com

rbenv:宝石セットなしで生き残る

TL; DR

  • ジェムセットを気にしないでください。 gemの複数のバージョンを同時にインストールできます。
  • 必要に応じて、$ gem-based-binary _version_ args表記を使用して実行するバージョンを指定します。
  • バージョンを指定するGemfileがある場合は、bundle execを使用します。
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の複数のバージョンを同時にインストールできます。バージョン制約を指定してGemfileでbundle execを介してコマンドを呼び出すか、最初の引数としてバージョンを指定しない限り、最新のものをコマンドラインから呼び出すときに使用されます。

参照 コマンドラインから古いバージョンのgemを呼び出すにはどうすればよいですか? re:アンダースコア-バージョン表記。


元の質問:

Railsの異なるバージョンを使用している複数のプロジェクトがあります。 Railsの特定のバージョンを使用してプロジェクトを作成し、プロジェクトを互いに分離しておくためのワークフロー(以下で説明)があります。他のワークフロー、特にRVMの代わりにrbenvを使用して実験したいのですが、その方法が明確ではありません。

QUESTION:ベストプラクティスとはを使用するときに、それぞれが異なるバージョンのRailsを使用する複数のRailsプロジェクトを作成する場合--- [ rbenv-gemsetまたはrvmとは対照的に、rbenvおよびbundler

SE CASE: ProjectAとProjectBという2つのRailsプロジェクトがあります。 ProjectAはRails( "RailsA")の1つのバージョンを使用して開発されていますが、ProjectBは別のバージョン( "RailsB")を使用しています。両方のバージョンをインストールする方法を教えてください。

THE GEMSETS APPROACH: Rails開発から始めたとき、私は [〜#〜] rvm [〜#〜] を使用しました。 Rubyの複数の同時インストールをサポートすることに加えて、RVMは複数の 名前付きジェムセット を持つことをサポートします。各プロジェクトには、gemsetと呼ばれる独自のgemのコレクション(Rails自体を含む)があります。

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

注:プロジェクトフォルダのcreationは、目的のバージョンのRailsを使用してRails newコマンドで実行(IMHO)する必要があります。スケルトンファイルはバージョンごとに異なります。 (おそらく私はこの前提を再検討する必要がありますか?)

THE BUNDLER APPROACH: RVMの代わりに rbenv を使用して遊んでいますが、ワークフローを明確に理解していません。 README.md で、Sam Stephensonは、「rbenvは... gemsetを管理しません。Bundlerは、アプリケーションの依存関係を管理するためのより良い方法です」と書いています。 rvmのgemsetと同じ結果を取得するためのプラグイン( rbenv-gemset )がありますが、Samは明らかに代わりにBundlerを使用することを好みます。残念ながら、彼はワークフローがどのようになるかについては詳しく述べていません。 Bundler のWebサイトでさえ、プロジェクトを別のプロジェクトから分離する方法のすべての点を明示的に関連付けているわけではありません。いくつかの ブログおよび要点 救助に来て、次の~/.bundle/configファイルを提案します。

---
BUNDLE_PATH: vendor/bundle

(ところで、「---」が何であるかはわかりません。ドキュメントにはそれについての言及がなく、違いがないようです。)

これにより、各Railsプロジェクトに独自のgemsetが効果的に与えられ、ProjectX/vendor/bundle /にgemが保存されます。実際、Rails自体はそこに(再)インストールされ、bundle installを実行すると、プロジェクトは残りの環境から完全に独立します。

ただし、部屋の象は、最初ににRailsプロジェクトフォルダを作成する場合の鶏と卵の問題ですplace !! RailsAを使用してProjectAフォルダーを作成するには、Rails(およびその多数の依存関係) first をインストールする必要があります。 。ただし、ProjectBを作成する場合は、RailsBの使用に切り替える必要があります。ジェムセットなしでは、いくつかの深刻なアップグレード/ダウングレードを行う必要があります。クールではありません。

考えられる解決策は、ProjectXフォルダーの作成に使用するRailsのバージョンを気にしないことです。次に、Rails 3.0を使用して3.2プロジェクトを作成すると、アプリ/アセットツリーを手動で作成できます。しかし、それは私を苛立たせます。より良い方法はありませんか?

43
Noach Magedman

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

新しいプロジェクトを_~/projects/Project2_に配置するとします。

_gem install Rails -v 3.2.13
cd ~/projects
Rails _3.2.13_ new Project2
_

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

新しいプロジェクト用にgemの個別のコピーを保持するという考えは、すべてのgemを1か所にインストールするというBundlerの哲学に反するため、意図的に省略しました。 Railsを実行すると、Bundlerはその中央の場所から正しいgemバージョンを自動的に選択します。つまり、プロジェクトは、それ自体の新しいコピーをインストールする代わりに、gemを共有できます。 (ただし、Rubyをインストールすると、バージョンごとに独自のgemが作成されます。ネイティブエクステンションがRubyバージョン。)

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

Sidenote:_Rails new_は_bundle install_を実行し、依存関係の最新バージョンをチェックします。依存関係の要件を満たす現在インストールされているgemをバンドラーに使用させたい場合は、_bundle install_と_Rails new --skip-bundle_をスキップして、アプリディレクトリで_bundle check_を実行できます。

サイドノート2:Project2のRubyバージョン(例:2.1.8))を使用したいとします。デフォルト(例:2.3.0)。その場合、上記のように_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
_

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

12
Kelvin

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

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をrubygemsにインストールせずに、新しいRailsアプリを選択したバージョンでブーストラップしました。

42
indirect

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

8
Max