Gemfileでrubygemを指定するときの〜>と> =の違いは何ですか?


120

Gemfileで次の表記(〜>)をよく見ます。

gem "cucumber", "~>0.8.5"
gem "rspec", "~>1.3.0"

記号(> =)がちょうど大きいか等しいことは知っていますが、(〜>)表記はどういう意味ですか?どちらも同じですか、それとも大きな違いがありますか?



28
~>「精巧なオペレーター」と呼ばれることもあります。
Andrew Grimm、

3
GemfileでRubyバージョンの範囲を指定できますか?例えばruby "~>2.0"
デニス・


@Dennisはここにあなたの質問への答えがあります:stackoverflow.com/a/23116552/6359753
Henry Yang

回答:


165

これは悲観的なバージョンの制約です。RubyGemsは提供されたバージョンの最後の桁をインクリメントし、最大バージョンに達するまでそれを使用します。したがって~>0.8.5、意味的には以下と同等です。

gem "cucumber", ">=0.8.5", "<0.9.0"

それを考える簡単な方法は、最後の桁が任意の値に増加しても問題ないことですが、文字列でそれより前の桁は、指定した値より大きくすることはできません。したがって、~>0.8.5、の場合、5以上の場合、3桁目(5)には任意の値を使用できますが、先頭の0.8は「0.8」でなければなりません。

たとえば、0.9バージョンがいくつかの重大な変更を実装する予定であるが、0.8.xリリースシリーズ全体が単なるバグ修正であることがわかっている場合は、これを行うことができます。

ただし、単に使用">=0.8.5"することは、0.8.5以降(またはそれ以降)のすべてのバージョンが許容されることを示します。上限はありません。


これは、バックボーンオンレールなどのバージョン番号に4桁を使用する宝石でどのように動作しますかか?
JJD

2
@JJD:基本的に同じ動作になるはずです。4つの最後の数字は~>0.9.2.3無制限にインクリメントできますが、3番目の数字はインクリメントできません(したがって、v0.9.2.4またはv0.9.2.23は許可されますが、v0.9.3.0は許可されません)。制約で3桁のみを指定した場合、4番目は本質的に無関係です-指定した最初の3つに基づいてのみ制約されます(たとえば~>0.9.2、0.9.xyシリーズ内のものyは何でも受け入れますが、制約は9はインクリメントできません)。
eldarerathis

3
ただし、「RubyGemsはバージョンの最後の桁をインクリメントする」というルールには例外があります。1桁を指定した場合です。「〜> 4」は「任意のバージョン4以降」を意味すると思われるかもしれませんが、そうではないので注意してください。
hlascelles 2014年

2
〜> 0.1対〜> 0.1.0はどうですか?「最後の桁が任意の値に増加しても問題ない」と考える場合、〜> 0.1は> = 0.1.0 <1.0.0に変換され、〜> 0.1.0は> = 0.1.0 <に変換されます。 0.2.0。あれは正しいですか?
2014

GitHubプロジェクトでルビー> = 2.4.4が必要と表示されている場合、2.4.4以降の2.5.1やルビー3を含むすべてのルビーをサポートしていると思いますか?それとも安全にプレイすべきですか(つまり、2.4.4以降ではすべてのルビーをサポートすると考えるのではなく、2.4.4より前のルビーをサポートしないという意味だと思います)。
Henry Yang

3

@millisami次のような悲観的制約を使用して、gemspecで依存関係を追加することもできます。

gem.add_runtime_dependency "thor", "~> 0.18.1"

gemの開発についてあまり知らない場合、またはgemの開発に取り掛かろうとしている場合は、以下の参考資料を参考にしてください。

  1. 独自のRubyGemの作成方法、RubyGemに関連する標準的な方法、他の人がインストールできるようにアップロードする方法を教えるチュートリアル。
  2. Bundlerで一から宝石を作成する方法

1
最初のリンクは404です
ペトルガザロフ2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.