私はbundlerとそれが生成するファイルに少し慣れていません。.gitignore
多くの人から提供されているGitHubのgitレポジトリのコピーを持っているので、バンドラーがレポジトリに存在せず、リストに含まれていないファイルを作成したことに驚きました。
フォークしたので、レポに追加してもメインレポは壊れないのはわかっていますが、プルリクエストをすると問題が発生しますか?
Gemfile.lock
リポジトリに含める必要がありますか?
私はbundlerとそれが生成するファイルに少し慣れていません。.gitignore
多くの人から提供されているGitHubのgitレポジトリのコピーを持っているので、バンドラーがレポジトリに存在せず、リストに含まれていないファイルを作成したことに驚きました。
フォークしたので、レポに追加してもメインレポは壊れないのはわかっていますが、プルリクエストをすると問題が発生しますか?
Gemfile.lock
リポジトリに含める必要がありますか?
あなたがrubygemを書いていないと仮定すると、Gemfile.lockはあなたのリポジトリにあるはずです。これは、必要なすべてのgemとその依存関係のスナップショットとして使用されます。このように、バンドラーはデプロイするたびにすべてのgem依存関係を再計算する必要はありません。
以下のカウボーイコードのコメントから:
gemで作業している場合は、Gemfile.lockをチェックインしないでください。Railsアプリで作業している場合は、Gemfile.lockをチェックインしてください。
これは、ロックファイルとは何かを説明する素晴らしい記事です。
実際の問題は、構成可能なデータベースアダプターが必要なオープンソースのRailsアプリで作業しているときに発生します。FatFreeCRMのRails3ブランチを開発しています。私の好みはpostgresですが、デフォルトのデータベースをmysql2にします。
この場合Gemfile.lock
でも、デフォルトのgemセットでチェックインする必要がありますが、自分のマシンで行った変更を無視する必要があります。これを達成するために、私は実行します:
git update-index --assume-unchanged Gemfile.lock
逆に:
git update-index --no-assume-unchanged Gemfile.lock
次のコードのようなものをに含めることも役立ちますGemfile
。これにより、database.ymlに基づいて適切なデータベースアダプターgemが読み込まれます。
# Loads the database adapter gem based on config/database.yml (Default: mysql2)
# -----------------------------------------------------------------------------
db_gems = {"mysql2" => ["mysql2", ">= 0.2.6"],
"postgresql" => ["pg", ">= 0.9.0"],
"sqlite3" => ["sqlite3"]}
adapter = if File.exists?(db_config = File.join(File.dirname(__FILE__),"config","database.yml"))
db = YAML.load_file(db_config)
# Fetch the first configured adapter from config/database.yml
(db["production"] || db["development"] || db["test"])["adapter"]
else
"mysql2"
end
gem *db_gems[adapter]
# -----------------------------------------------------------------------------
これが確立されたベストプラクティスであるかどうかはわかりませんが、私にとってはうまくいきます。
異なるプラットフォーム、Windows、Macを使用しており、サーバーがLinuxであるため、同僚と私は異なるGemfile.lockを使用しています。
database.ymlと同様に、リポジトリでGemfile.lockを削除し、gitリポジトリでGemfile.lock.serverを作成することにしました。次に、サーバーにデプロイする前に、capdeployhookを使用してGemfile.lock.serverをサーバー上のGemfile.lockにコピーします。
r-dubに同意し、ソース管理を維持しますが、私にとっての本当の利点は次のとおりです。
同一環境でのコラボレーション(windohsとlinux / macのものは無視)。Gemfile.lockの前に、プロジェクトをインストールする次の男は、自分を責め、あらゆる種類の紛らわしいエラーを目にするかもしれませんが、彼は、既存の依存関係を壊して、次のバージョンのスーパーgemを入手した幸運な男でした。
さらに悪いことに、これはサーバーで発生し、懲戒処分を受けて正確なバージョンをインストールしない限り、テストされていないバージョンを取得します。Gemfile.lockはこれを明示的にし、バージョンが異なることを明示的に通知します。
注::developmentと:testのように、グループ化することを忘れないでください
Bundlerドキュメントはこの質問にも対応しています。
オリジナル:http://gembundler.com/v1.3/rationale.html
編集: http: //web.archive.org/web/20160309170442/http ://bundler.io/v1.3/rationale.html
「コードをバージョン管理にチェックインする」というセクションを参照してください。
アプリケーションをしばらく開発した後、GemfileおよびGemfile.lockスナップショットと一緒にアプリケーションをチェックインします。これで、リポジトリには、アプリケーションが機能したことを確認したときに最後に使用したすべてのgemの正確なバージョンの記録があります。Gemfileには(バージョンの厳密さの程度が異なる)3つのgemしかリストされていませんが、依存するgemの暗黙の要件をすべて考慮すると、アプリケーションは数十のgemに依存することに注意してください。
これは重要です。Gemfile.lockを使用すると、アプリケーションは、すべてが機能していることが確実にわかったときに、独自のコードと最後に実行したサードパーティコードの両方の単一パッケージになります。Gemfileで依存しているサードパーティコードの正確なバージョンを指定しても、同じ保証は提供されません。これは、gemが通常、依存関係のバージョンの範囲を宣言しているためです。
次回同じマシンでbundleinstallを実行すると、bundlerは必要なすべての依存関係がすでにあることを確認し、インストールプロセスをスキップします。
.bundleディレクトリまたはその中のファイルをチェックインしないでください。これらのファイルは特定のマシンごとに固有であり、bundleinstallコマンドの実行間でインストールオプションを永続化するために使用されます。
バンドルパックを実行した場合、バンドルに必要なgem(git gemではありません)がベンダー/キャッシュにダウンロードされます。必要なすべてのgemがそのフォルダーにあり、ソース管理にチェックインしている場合、Bundlerはインターネット(またはRubyGemsサーバー)に接続せずに実行できます。これはオプションの手順であり、ソース管理リポジトリのサイズが大きくなるため、お勧めしません。
2021年の簡単な答え: Gemfile.lockはRubygemsのバージョン管理にも含まれている必要があります。受け入れられた答えは現在11歳です。
ここでいくつかの理由(コメントからチェリーを選んだ):
@josevalim https://github.com/heartcombo/devise/pull/3147#issuecomment-52193788
寄稿者と開発者はプロジェクトをフォークし、動作が保証されているバージョンを使用して実行できる必要があるため、Gemfile.lockはリポジトリにとどまる必要があります。
@rafaelfranca https://github.com/rails/rails/pull/18951#issuecomment-74888396
プラグインの場合でも、ロックファイルを無視するのは良い考えではないと思います。
これは、数十の依存関係の1つがアップグレードされてコードが壊れたため、「git clone;bundle;raketest」シーケンスが合格することを保証しないことを意味します。また、@ chancancodeが言ったように、それは二分するのを非常に難しくします。
また、RailsのgitにはGemfile.lockがあります。
Gemfile.lockがないということは、次のことを意味します。
->常にGemfile.lockをチェックインし、さらに徹底したい場合はtravisに削除させますhttps://grosser.it/2015/08/14/check-in-your-gemfile-lock/
パーティーに少し遅れましたが、答えはまだ私に時間と外国の読書がこの問題を理解するのにかかりました。そこで、Gemfile.lockについて私が見つけたものを要約したいと思います。
Railsアプリを構築するときは、ローカルマシンで特定のバージョンのgemを使用しています。本番モードや他のブランチでのエラーを回避したい場合は、その1つのGemfile.lockファイルをどこでも使用し、bundle
変更されるたびにgemを再構築するようにbundlerに指示する必要があります。
Gemfile.lock
本番マシンでが変更され、Gitで許可されない場合は、そのファイルの変更を回避するためにgit pull
書き込みを行ってから、再度書き込みを行う必要があります。git reset --hard
git pull
ここでの他の答えは正しいです:はい、Rubyアプリ(Ruby gemではない)をリポジトリに含める必要がありますGemfile.lock
。これを行う必要がある理由を詳しく説明するには、以下をお読みください。
私は、各env(開発、テスト、ステージング、prod ...)がそれぞれbundle install
独自のGemfile.lockを構築するという誤った考えにさらされていました。私の仮定は、Gemfile.lockに:test、:prodなどのグループ化データが含まれていないという事実に基づいていました。この仮定は間違っていました。
よく調べてみると、Jenkinsビルドが特定のgem(ffaker
、FWIW)のフェッチに成功した理由がわかりませんでしたが、アプリが読み込まれてffakerが必要な場合、ファイルが見つからないと表示されました。WTF?
もう少し調査と実験を行ったところ、2つのファイルの機能がわかりました。
まず、Gemfile.lockを使用して、この特定の環境で使用されないものも含め、すべてのgemをフェッチします。次に、Gemfileを使用して、フェッチされたgemのどれをこの環境で実際に使用するかを選択します。
したがって、Gemfile.lockに基づいて最初のステップでgemをフェッチしたとしても、Gemfileのグループに基づいて、:test環境には含まれていませんでした。
修正(私の場合)はgem 'ffaker'
、:developmentグループからメイングループに移動することでした。これにより、すべての環境でそれを使用できるようになりました。(または、必要に応じて、:development、:testにのみ追加します)