2017-04-23 2861 views
0

我正在使用具有依賴項的Gem,其版本必須因安裝了的時根據運行的Ruby版本而異。具體而言,當前版本的nio4r gem需要Ruby版本> = 2.2.2,而需要nio4rasync gem理想情況下應該能夠在任何Ruby版本> = 2.0的條件下運行。如何在Gem安裝時指定Gem依賴版本

我試圖把一些代碼到gemspec文件變化的版本,但它似乎是,當創業板,而不是當它是安裝執行它。換句話說,nio4r版本根據用於構建gem的任何版本的Ruby來硬編碼到gem中。這裏是我在gemspec中嘗試的代碼(say是一個OS X命令,用於說出一個字符串,並且對知道發生了什麼以及什麼時候非常有幫助;稍後我會將其刪除)。

# Recent versions of nio4r require a Ruby version >= 2.2.2. 
# If the version used is earlier, load an earlier version of nio4r. 
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.2') 
    `say Installing latest version of nio4r` 
    spec.add_runtime_dependency "nio4r" 
else 
    `say Installing nio4r version 1.2.1` 
    spec.add_runtime_dependency "nio4r", '1.2.1' 
end 

正如我所說的,這是創業板build執行,而不是install。我知道,我可以使用bundler這種東西,並把規範放在Gemfile,但據我所知,該文件將不會被使用,當寶石是gem install'編輯。

我怎樣才能獲得依賴的寶石版本在寶石安裝時變化?

我正在尋找一個自動化的解決方案,也就是說,不涉及任何這個寶石的用戶干預。另外,由於安裝了另一個gem,該gem將被安裝,所以我不希望用戶必須跟上對其依賴gem的更改,並且必須手動修改Gemfile。這可能會違反德米特法。

回答

0

沒有辦法,我知道的動態更新創業板的gemspec文件紅寶石版本,但是你可以將其鎖定到特定的紅寶石版本:

spec.required_ruby_version = '>= 2.2.2' 

或者你可以建議消費者你的寶石(也許在自述文件中),如果他們使用2.2.2版本的ruby版本,他們必須強制使用nio4r的特定版本。

在Gemfile中的一個新的Ruby:

ruby "2.4.1" 
gem "keiths_gem" 

在Gemfile中使用舊版本的Ruby:

ruby "2.1.0" 
gem "keiths_gem" 
gem "nio4r", '1.2.1' 
+0

謝謝,但我要找的是自動化的解決方案,那就是,不涉及此寶石用戶的任何干預。另外,由於安裝了另一個gem,該gem將被安裝,所以我不希望用戶必須跟上對其依賴gem的更改,並且必須手動修改Gemfile。這可能會違反德米特法。我應該提到的是,我現在就要這樣做。 –