2013-04-05 18 views
2

我創建了一個gem(我們稱之爲mygem),它基本上是一個Sinatra服務器,旨在安裝在基於Rack的應用程序中。通過Bundler和安裝的應用程序加載當地寶石

在我的寶石的gemspec文件,我有以下幾點:

gem.add_dependency 'kss' 

而且在我的寶石的Gemfile中,從mygem的文件夾中運行服務器的時候,我有以下

source 'https://rubygems.org' 

gemspec 

gem "kss", :path => "/Users/me/code/kss" 

現在,它的工作原理與預期完全一樣:不是取出kss依賴項,而是在我的本地驅動器上查看並加載該版本。

當我將mygem添加到Rails測試應用程序Gemfile時,問題就出現了。在我的Rails測試應用程序的Gemfile,我有以下行:

gem "mygem", :path => "/Users/me/code/mygem" 

我所期望的,在一個bundle install,那捆紮機將加載mygem和它的依賴;但對於kss依賴關係,Bundler實際上並沒有加載本地依賴項,而是取出到rubygems來查找並加載它。我假設,因爲在這種情況下,它只是從gemspec行讀取,不包括我的依賴覆蓋。

有什麼我可以做的,以解決這種行爲?我非常希望能夠在本地運行和測試這些東西,但Bundler似乎無法識別來自更高級別應用程序的依賴覆蓋。

如果我以錯誤的方式回答這個問題,我完全接受任何建議或更改。

回答

1

您的gemspec中列出的依賴項將成爲實現應用程序的依賴項,而在Gemfile中定義的依賴項不會成爲實現應用程序的依賴項。我認爲你應該能夠簡單地將Rails測試應用程序Gemfile調整爲:

gem "kss", :path => "/Users/me/code/kss" 
gem "mygem", :path => "/Users/me/code/mygem" 
+0

嘿,這工作得很好!而對於開發來說,這是一個很好的解決方案。但是,如果我有'kss'分支,我需要使用'mygem'實際準備好生產時,我猜我需要指示用戶將這兩行添加到他們的Gemfiles中?用這種設置的方式,沒有其他方法通過gemspec文件添加這個分支依賴關係,對吧? – joeellis 2013-04-06 15:45:20

+0

實際上,如果您將「真正」的寶石(沒有本地路徑)添加到您的gemspec中,它們應該在實現應用程序中優先,並按照您的意圖工作,而不需要額外的工作。如果您想在實施應用程序中使用本地寶石,只需將路徑添加到gem文件,如上所述,以「覆蓋」它。 – 2013-04-06 16:21:53

+0

對,但除非我誤解了你,否則我將無法釋放依賴於'kss'分支的'mygem',而不會讓'mygem'的用戶在其實施應用程序的Gemfile中添加兩行(不是說這是一個很大的問題,除非我能解決問題才帶來一點麻煩),對吧? – joeellis 2013-04-06 19:14:43