2012-02-13 8 views
55

私はrubygems.orgに多くの宝石が、正確なバージョンではなくメジャーバージョンでそれらを指定することを示唆しています。たとえば...Gemfileに正確なバージョンを指定する必要がありますか?

The haml-rails gem ...

このような正確なバージョンを見極める方が良いでしょうのように、それは私には思えた Bundler docsに基づいしかし
gem "haml-rails", "~> 0.3.4" # "$ bundle install" will acquire the 
           # latest version before 1.0. 

、...

gem "haml-rails", "0.3.4" 

ハムレールの宝石があり、そのすべての依存関係が漂っていません。数週間後に別のマシンでプロジェクトをチェックアウトし、$ bundle installを実行すると、指定したすべてのバージョンとまったく同じバージョンになります。

私は、ポイントリリースで不具合が発生しているのを見たことがあります.Bundlerのアイデアの一部は、すべての宝石のバージョンが「Bundle.lock」だったと思いました。

しかし、rubygems.orgでは「〜>」が多すぎますので、何か不足しているかもしれません。

BundlerとGemの管理を理解する上で非常に役立ちます。

答えて

51

これはGemfile.lockファイルの目的で、bundle installを実行してGemfile.lockを実行するとそこにある依存関係を使用してインストールされます。それはGemfileを再解決しません。依存関係を更新する/宝石のバ​​ージョンを更新するには、bundle updateを明示的に実行する必要があります。これによりGemfile.lockファイルが更新されます。

Gemfile.lockが存在しない場合は、依存関係と宝石のバージョンが変更される可能性があるため、本番環境にコードをデプロイすることは大きな問題になります。

要するに、rubygems.orgが推奨するように、悲観的なバージョン制約演算子(~>)を使用することは、一般的に安全です。 bundle updateを実行した後にテストを再実行して、何も壊れていないことを確認してください。

Yehuda Katzのnice articleには、Gemfile.lockに関する情報が少しあります。

+0

宝石はGemfile.lockに記録された定評のあるバージョンにとどまります。では、「〜>」を追加する目的は何ですか?それはどのように有利ですか? – Ethan

+2

@ethan RubyGemsには[doc](http://rubygems.rubyforge.org/rubygems-update/Gem/Version.html)の説明があります(「バージョンの災害の防止」を参照)。その要点は、バージョン番号の最後の整数を増やすことだけです(例: '〜> 1.0.5'はバージョン1.0.9999に更新できますが、1.1.xには決してできません)。このメカニズムは、宝石の更新を可能にするものですが、非互換性を導入することなく、物事を壊すことはありません(宝石はアウトラインをリンクする "Rationalバージョン管理"ポリシーに従っているものとします)。 –

+1

@ethanここではRubyDocsサイトの "[悲観的な演算子](http://docs.rubygems.org/read/chapter/16#page74)"(〜>)と[合理的なバージョン管理](http ://docs.rubygems.org/read/chapter/7)。 –

5

私は間違いなく正確なバージョン番号を使用すると思います。おそらく、常にメジャーバージョンにロックするか、バージョンを指定することはできません。大丈夫ですが、他のマシンで実行されている場合には、きめ細かいコントロールレベルをあなたのプログラムに100%信頼できるようにするには、正確なバージョン番号を使用してください。

正確なバージョン番号が指定されていない状況に陥りました。自分や他の人がbundle installを実行したときに、新しいバージョンになったためプロジェクトが壊れました。これは、本番環境にデプロイするときに特に悪いことがあります。

バンドラーは、あなたの宝石の仕様にロックを行いますが、あなただけのメジャーリリースを使用するためにそれを言っている場合、それは「>ああバージョンがででロックされている0.1」だからだけであることを知っているであること。ロックまたは何か、しかし、 "ああバージョンは特に0.1.2.3でロックされていません"。

+8

もし 'Gemfile.lock'が存在すれば、Bundlerは実際にインストールする特定のバージョンを知っています(' Gemfile.lock'が 'Gemfile'と一緒にリポジトリに保存される理由)。 – mipadi

+1

'bundle update 'を実行すると、 'Gemfile。ロックが存在し、それは危険で粘着性のある状況になり得る。 – MrDanA

+0

私はこの問題についてRubyGems自身の推奨に同意します:悲観的な制約(〜>)を使用してください。これにより、コミュニティ全体がセマンティックバージョニングを積み重ねることができます。これは良いことです。これとGemfile.lockの組み込み安定性機能との間には、カバーする以上のものが必要です。 – user456584

関連する問題