2011-06-27 137 views
71

可能有一個git分支依賴項,在mygem.gemspec裏面?Ruby Gemspec依賴:可能有一個git分支依賴?

我想類似下面的內容:

gem.add_runtime_dependency 'oauth2', :git => '[email protected]:lgs/oauth2.git' 

...但它不工作。

+0

我有這個相同的問題,除了我想要一個路徑依賴,而不是一個混帳依賴。有沒有辦法繞過這個莫名其妙?也許通過在gemspec某處粘貼一些黑客的Ruby代碼? – Ajedi32

回答

37

這是不可能的,也可能永遠不會,因爲RubyGems會讓寶石開發人員要求用戶安裝特定的版本控制系統來訪問寶石。寶石應該是獨立的,具有最少數量的依賴關係,以便人們可以儘可能廣泛地使用它們。

如果你想爲自己的內部項目做到這一點,我的建議是使用Bundler,這很好地支持這一點。

+12

...是的,但我該怎麼辦? –

+0

我捆綁了一個實際重新捆綁許多其他的gem(omniauth),如法拉第和oauth2,它們都指向一箇舊的法拉第(0.6.1)。我試圖解耦嵌套的依賴關係... –

+6

你這樣做就像你所建議的,但在Gemfile中。如果沒有明確的oauth2要求,添加它(「gem'oauth2',:git =>'....'」),並安裝捆綁包。 – gtd

12

編輯

根據評論者,這不再是真實的。保留歷史信息的先前信息。

在Gemfile和.gemspec中複製對gem的引用現在似乎會在Bundler中引發警告消息,因此此答案似乎不再爲真。

過時的信息

This文章耶胡達·卡茨清理類似的困惑我。它說,僅在開發中使用時,最好將geit文件添加到gemfile中,但該打包程序仍然會使用gemspec中的dependency/version信息(對我來說似乎很神奇,但我相信Yehuda)。

+3

這有什麼神奇的? Bundler只能從Gemfile中讀取 - 除非如果您將'gemspec'放在那裏,它也會從gemspec中讀取。所以當你運行'bundle install'時,我假設(但沒有測試過)會發生什麼,Bundler會安裝Gemfile中指定的gem。由於Bundler已經安裝了它,因此該gem可用於gem「require」,而不管它是否來自gem存儲庫。沒有魔法,只有Bundler照常工作。 –

+2

在Gemfile和.gemspec中複製對gem的引用現在似乎在Bundler中引發了一條警告消息,因此此答案似乎不再是真的... –

5

我只是想解決這個問題。我剛剛提出了以下解決方案(我不知道您是否發佈您的寶石或有權重新分配oauth2寶石)。

在你的寶石,需要oauth2寶石運行此。

git submodule add [email protected]:lgs/oauth2.git lib/oauth2 

如果你需要一個不同的分支比默認

cd lib/oauth2 && git checkout <branchname_or_ref> 
cd .. && git add lib/oauth2 
git commit -m "adding outh2 submodule" 

在你gemspec添加此您需要版本線以上

$:.push File.expand_path('../lib/oauth2/lib', __FILE__) 

而且你需要添加所有的oauth2 gem的運行時依賴關係到你的gemspec。我還沒有想出解決辦法。

這就是我所做的,它適用於我們,因爲我們的寶石是通過git需要的,所以我不確定這是否適用於rubygems發佈的寶石。

+0

將依賴項作爲子模塊添加是正確的解決方案撰寫了這兩個寶石,都在積極發展。 – benjineer