web-dev-qa-db-ja.com

Ruby Gemfileの複数のソースをバンドルする

一部のgemがrubygemsではなく独自のgemリポジトリからインストールされていることを確認する必要がありますが、残りはrubygemsからインストールされます。 Rubygemsで同じ名前のgemとの名前の競合を心配せずに、Gemfileでこれを設定できますか? gemがどこからダウンロードされたかをどのように判断できますか?

例:Gemfile:

source :rubygems  
gem 'gemfromrubygems1'  
gem 'gemfromrubygems2'

source "http://our.own.gem.repo.com/the/path/to/it"  
gem 'gemfromourrepo'
30
mawk044

Bundler 1.7には、特定のgemをブロックでネストすることにより、それらのソースを選択できる新機能があります。

source "https://rubygems.org"

gem 'gemfromrubygems1' 
gem 'gemfromrubygems2'

source "http://our.own.gem.repo.com/the/path/to/it" do
  gem 'gemfromourrepo'
end

またはそれをオプションとして指定します:

source "https://rubygems.org"

gem 'gemfromrubygems1' 
gem 'gemfromrubygems2'

gem 'gemfromourrepo', source: "http://our.own.gem.repo.com/the/path/to/it"

詳細は http://bundler.io/v1.7/gemfile.html を参照してください。

47
Tim Moore

Gemfile manpage のSource Priorityセクションに従って、ソースは最後に入力されたものから最初に入力されたものまで検索されます。

あなたが言ったことに基づいて、あなたは常にあなたの宝石を優先したいようですrubygems.org。好みを変える必要がない限り(つまり、rubygems.orgとプライベートリポジトリからのいくつかの重複)次に、問題は次のGemfileで簡単に解決されます。

source 'https://rubygems.org'
source 'http://our.own.gem.repo.com/the/path/to/it'

gem 'gemfromrubygems1'  
gem 'gemfromrubygems2'
gem 'gemfromourrepo'
6
gtd

私が見つけた唯一の方法は恐ろしいハックのようです。

Bundlerは、最後にリストされたソースから始めて、次に以前にリストされたすべてのソースを検索して、gemの最適なバージョンを検索します。ソース行がgem行に対して相対的であるかどうかは関係ありません。互いに対してのみ相対的です。

:gitと:pathを使用して機能させようとしましたが、gemserversでは機能しません。これで、最良のバージョンに一致します。

Gemのバージョンを2.mine.1のようなものに設定し、それをサーバーにプッシュすると、Gemfileでバージョンを制約できます。

source :rubygems
source 'http://myrepo'    
gem 'gemfromourrepo', '~> 2.ourrepo'

次に、最も一致するバージョンがサーバーのバージョンである必要があります。誰かが2.ourrepo.2で同じ名前の自分の宝石をrubygemsにプッシュする可能性がありますが、それが一意であるとは考えられません。

4

Pathコマンドが役立つかもしれません。宝石固有のソースを設定できます

gem "foo", "1.0", :path => "bar"

ソース: http://bundler.io/v1.3/man/gemfile.5.html

1
Btuman