Gemfile.lockは、依存関係のバージョン管理の悪い習慣を永続させるために使用されるハックではありませんか?RubyにGemfile.lockが必要なのはなぜですか?
I.e.開発者は依存関係のバージョン範囲を厳密にGemfileに設定してはいけませんか?
例えば、私のGemfileがgem Aバージョン1.0.1またはバージョン[1.0-2.0]に依存していると言われた場合、なぜロックが必要なのでしょうか?
Gemfile.lockは、依存関係のバージョン管理の悪い習慣を永続させるために使用されるハックではありませんか?RubyにGemfile.lockが必要なのはなぜですか?
I.e.開発者は依存関係のバージョン範囲を厳密にGemfileに設定してはいけませんか?
例えば、私のGemfileがgem Aバージョン1.0.1またはバージョン[1.0-2.0]に依存していると言われた場合、なぜロックが必要なのでしょうか?
いいえ、Gemfile.lock
は多くの意味を持ち、自動的に宝石のバージョンを選ぶというコンセプトにとって重要です。開発者は、正確なバージョン番号を気にする必要はありません。 「宝石Xのバージョンが他のすべての宝石の他のすべてのバージョンに合っているかどうかを私に教えてください」と言うことができます(これ以上の情報なしでgem 'xyz'
と言うだけです)。または、古いバージョンの宝石(gem 'xyz', '~> 2.3.0'
)などのバグフィックスラインに留まるように指示することもできます。
正確なバージョンをGemfile.lock
に追加すると、バージョンがすべての開発者(および環境)で一貫していることを確認します。ビルド/デプロイメントプロセスのランダムな部分ではなく、意識的な(そして文書化された)選択肢の新しいバージョンへのアップグレードを行います。
なぜロックが必要なのですか?
チーム内の他のすべての人と全く同じバージョンをインストールします。また、開発時に使用するものと同じバージョンを本番環境にインストールすることもできます。
あなたのリリースのサインオフを収集している間に、いくつかの宝石の新しいバージョンがリリースされることがあります。 正確にはを開発/テストしたバージョンをインストール/ロードすることをお勧めします。
最後の文である「あなたが開発/テストしたバージョンを正確にインストール/ロードすることをお勧めします。」と私は共鳴し、アップヴォートを得る。 – pjd
重要な場合は、npm、bower、maven、OSGiなどのシステムでどうしてそれを使用しないのですか?デプロイメントシステムがGemfileのバージョン範囲に基づいて、すべての宝石の中でもっとも互換性の高い依存バージョンを使用することは意味がありませんか? – PedroD
@PedroD npmには、[shrinkwrap](https://docs.npmjs.com/cli/shrinkwrap)があります。これは非常によく似ています。人々はそれぞれのエコシステムを使い方が異なっているか、実装するのが難しいため(具体的には、再帰的および循環的な依存関係をもっています) –
@PedroD、私はそれらの他のシステムそれと関係があります。私はそれが有用で重要な理由を2つの非常に明確な理由を与えたと信じています。あなたが確信していない、または私の説明が悪いと感じたら、私はもっと説明してくれるだけではありません。別の肯定的な例が必要な場合は、Perlの世界の 'カートン'を考えてください。これはルビーの 'bundler'とまったく同じです。 – AnoE