2010-11-22 22 views
31

共通のパターンがあります:開発者ごとにGemfileをカスタマイズするには?

多くの開発者が1つのプロジェクトで作業しており、Gemfile(.lock)はSCMで共有されています。しかし、いくつかの開発者がテストと開発のために異なるツールを使いたい場合はどうすればよいでしょうか?どうやってするの?

問題は、条件付きセクションをGemfileに入れると、Gemfile.lockも開発者ごとに異なるため、SCMにコミットするたびに競合が発生するということです。

シンプルで広く認識されているソリューションはありますか?

+3

を参照してください。.. –

+0

実際に、私はそれに反して、それはかなり若い技術であり、そのドキュメンテーションはあまり詳細ではない(プラス多分豊富ではないオプションもある) – Jakub

+1

問題はまだGemfile.lockになり、rvm docsはそれをチェックすることをお勧めします...おそらくそれをローカルで無視することは一時的な修正となるでしょう –

答えて

0

私は(最近追加された)install_if方法で問題が解決したとします

install_if -> { `whoami`.strip == 'jakub' } do 
    gem "pry-rails" 
end 

私はそれがちょうど私バンドラに悩まされている人ではありません聞いてうれしいhttp://bundler.io/v1.14/man/gemfile.5.html#INSTALL_IF

0

各開発者は独自のブランチを作成できます.Bundlerは異なるGemfileの内容を持つ異なるブランチでうまく動作します。混乱や衝突を避けるために、開発者がブランチ名に頭文字を付けることをお勧めします。

+4

Bundlerの見落としを防ぐためにブランチを作成していますか?ヤック私はGitの分岐が安いことを知っていますが、それでもなおオーバーヘッドです。 –

+1

私はそれをむしろSCMの使い方の反パターンと呼んでいます。それは残念です。 – Jakub

+0

これはBundlerの監視ではありません。 Bundlerの背後にあるすべてのアイデアは、すべての依存関係を凍結して、誰もが同じ環境になるようにすることです! – rubiii

3

gemfileにある宝石に依存するものをチェックインすると、リポジトリ内のコードがgemに依存しない場合、gemfileにそのコードを入れる必要はありません。とにかくテストスイート全体を実行したい場合、開発者がテストをチェックインしない限り(これは不思議です)、すべてのテストの依存関係が必要になります。

アプリケーションやそのテストを実行するために宝石が必要ない場合、宝石はgemfileに存在する必要はありません。それぞれの開発者がアプリケーション用にgemsetを作成するようにしてください(そうしないとRVMを使用していると仮定します)。必要なものをインストールしてから、アプリケーションをgemfileに追加する必要があります。

+2

開発者が開発で異なるデータベースエンジンを使用している場合はどうなりますか? –

+1

なぜ彼らはそれをしたいと思いますか?誰もが自分の好みを持っていますが、あなたは実用的でなければなりません。 –

+0

@ user438962いくつかのケースでは、postgresよりもsqliteを好むさまざまな理由があります - 主に、使いやすさ –

18

私は私のGemfileでこれを持っているのが好き:

local_gemfile = File.dirname(__FILE__) + "/Gemfile.local" 
if File.file?(local_gemfile) 
    require local_gemfile 
end 

私もgitignoreにGemfile.localとGemfile.lockを持っています。私は私が "はず"していないことを知っていますが、(あなたの質問で言及したような)警告は価値があるとは思いません。バンドラー1.0.10用

UPDATE私はRailsの3とバンドラー1.0.10でこれを使用していた2011年3月3日

local_gemfile = File.dirname(__FILE__) + "/Gemfile.local.rb" 
if File.file?(local_gemfile) 
    self.instance_eval(Bundler.read_file(local_gemfile)) 
end 

のよう。

+0

/home/jake/.rvm/rubies/ruby-1.8.7-p330/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:29:in 'gem_original_require ':ロードするファイルがありません -/home/jake/code/fullstop/Gemfile.local(LoadError) – jakeonrails

+2

Gemfile.lockファイルについてどうしますか?私は組織でこれを展開しようとしましたが、開発者のブランチ間で変更されることに気付きました。 –

+0

私はHerokuにプッシュするときにこれが失敗する唯一の人ですか? (GemfileとGemfileとの間の不一致について不平を言う。ロック) – user456584

-1

(8月Lilleaasさんのコメントのように、基本的には同じ考え方:gitignore)

がSCMでデフォルト/最小限のGemfileを入れて、その後、開発者がシステム上でそれを変更してコミットしたことがありません。 SVNクライアント(使用している場合)の非アクティブなチェンジセットにそれらを追加させるようにしてください。他のSCMには同様のものが必要です。

これは、我々は、私の会社でこれを行う方法です - 本当によく働く:)

+1

誰にでも-1を与えてくれる人は、いつも理由を明記してください。 – sscirrus

+0

ありがとう、sscirrus。 –

+2

これは、開発者間の差分Gemfile.lockファイルの問題を解決しません(チェックインする必要があり、OPはそうしていると言います)。開発者はGemfile.lockにある変更をコミットすることができますが、これは扱いにくいです。 –

2

あなたがグループを除外するためにバンドラーのwithoutフラグを使用することができます。

次のGemfileを持っている場合は

group :jakubs_testing_tools do 
    gem "rspec" 
    gem "faker" 
end 

あなたはそれが今、あなたを助けにはなりませんbundle install

$ bundle install --without jakubs_testing_tools 

http://gembundler.com/groups.html

+0

これはきれいだと思うが、私たちは5人でチームは大規模ではないが、もちろん実行可能だが、Gemfile.lockについてはどうだろう? – Jakub

2

でそれらを除外することができますが、そこをされているオープンfeature request BundlerがGemfile.localのサポートを追加しました。 1.xシリーズのどこかで予定されているので、お楽しみください。

主な問題が開発者固有のIRB宝石である場合は、問題のcommentsにいくつかの回避策があります。

+0

[現在の公式の決定](https://github.com/bundler/bundler/issues/183#issuecomment-22037131)はサポートされていないということです。あなたがリンクしている回避策またはここでの主な答えは、あなたのGemfile.lockにこのすべての迷惑メールが含まれているという問題のために良いオプション –

+0

です。 – patrick