我的公司有一个私有的宝石一体机服务器,多个团队可以共享内部创建的宝石。最近,我想要使用的服务器中添加了一个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服务器中的唯一解决方案,以便它可以将它们作为本地依赖项找到?
提前致谢!
答案 0 :(得分:1)
看起来the docs说不(非常底):
消息来源
尝试定位宝石以满足宝石时 要求,bundler使用以下优先级顺序:
- 明确附加到gem的源(使用:source,:path或 :git)
- 对于隐式宝石(显式宝石的依赖关系),任何来源, git,或在父级上声明的路径存储库。这导致了 bundler优先考虑Rails git中的ActiveSupport gem 存储库来自rubygems.org
- 通过指定的来源 全局源代码行,从上一次搜索Gemfile中的每个源代码 添加到第一个添加。
醇>
相关的人在这里#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的源,然后用它来解析另一个源中的依赖。因此,当我们的问题得到解决时,问题仍然存在。