Bundler - 解决来自不同来源的依赖关系

时间:2015-04-21 22:22:49

标签: ruby bundler gemfile

我的公司有一个私有的宝石一体机服务器,多个团队可以共享内部创建的宝石。最近,我想要使用的服务器中添加了一个gem。事实证明,这个gem依赖于net-ssh和net-scp,可以从ruby-gems.org获得,而不是存储在Gem-in-a-box服务器上。当我将新gem添加到我的Bundler Gemfile并运行安装时,我收到以下错误:

C:\jruby-1.7.18\bin\jruby.exe --1.9 C:\jruby-1.7.18\bin/bundle install

Fetching source index from http://my.server.org/geminabox/
Fetching gem metadata from http://rubygems.org/.
Fetching source index from http://my.server.org/geminabox/
Fetching gem metadata from http://rubygems.org/.
Fetching additional metadata from http://rubygems.org/........
Resolving dependencies...
Could not find gem '["net-ssh", "net-scp"] (>= 0) java', which is required by
gem 'gem_dependent_on_ssh (>= 0) java', in any of the sources.

Process finished with exit code 6

以下是我的Gemfile的片段:

source 'http://rubygems.org' do
  gem 'net-scp'
  gem 'net-sftp'
end

source 'http://my.server.org/geminabox/' do
  gem 'gem_dependent_on_ssh'
end

看起来它只是在加载宝石的同一服务器上寻找宝石依赖...我可以添加到我的Gemfile来解决这个问题吗?或者,我可以去创建gem的团队,并让他们添加一些东西来告诉它在哪里寻找依赖项?或者,是将net-ssh和net-scp gems添加到Gem-in-a-box服务器中的唯一解决方案,以便它可以将它们作为本地依赖项找到?

提前致谢!

2 个答案:

答案 0 :(得分:1)

看起来the docs说不(非常底):

  

消息来源

     

尝试定位宝石以满足宝石时   要求,bundler使用以下优先级顺序:

     
      
  1. 明确附加到gem的源(使用:source,:path或   :git)
  2.   
  3. 对于隐式宝石(显式宝石的依赖关系),任何来源,   git,或在父级上声明的路径存储库。这导致了   bundler优先考虑Rails git中的ActiveSupport gem   存储库来自rubygems.org
  4.   
  5. 通过指定的来源   全局源代码行,从上一次搜索Gemfile中的每个源代码   添加到第一个添加。
  6.   

相关的人在这里#2。这有点模糊,但我认为文档的其他部分有助于澄清:

  

Bundler将通过首先查看为父选择的源来搜索此gem的子依赖项,但如果在那里找不到它们,它将使用SOURCE PRIORITY中描述的顺序回退到全局源。

所以听起来你需要提供rubygems.org作为后备全局源代码,如果你想要这样的话,就像你在答案中一样使用source 'http://rubygems.org'行。否则,当查找子gems(依赖项)时,它将仅查看为父级提供的源。

那就是说,我也有一个公司的Gem-in-a-box服务器,并尝试重现你的问题,但不能,所以我不肯定我正确地解释这些文档。

答案 1 :(得分:0)

在咨询了其他一些消息来源之后,看来如果您删除这些块并只是声明来源,它会设法安装所有宝石:

source 'http://rubygems.org'
source 'http://my.server.org/geminabox/'

gem 'net-scp'
gem 'net-sftp'
gem 'gem_dependent_on_ssh'

虽然这确实解决了这个特定的问题,但我仍然可以想象一个场景,你想要指定特定gem的源,然后用它来解析另一个源中的依赖。因此,当我们的问题得到解决时,问题仍然存在。