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

Bundler - Resolving Dependencies from different sources

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

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

这是我的 Gem 文件中的一个片段:

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

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

提前致谢!

在咨询了其他一些来源后,似乎如果您删除块并简单地声明来源,它会设法安装所有 gems:

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

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

虽然这确实解决了这个特定问题,但我仍然可以想象这样一种情况:您想要为特定 gem 指定源,然后使用它来解决另一个源中的依赖项。因此,虽然我们的问题已经解决,但问题仍然存在。

貌似the docs说不(很底):

SOURCE PRIORITY

When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order:

  1. The source explicitly attached to the gem (using :source, :path, or :git)
  2. For implicit gems (dependencies of explicit gems), any source, git, or path repository declared on the parent. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from rubygems.org
  3. The sources specified via global source lines, searching each source in your Gemfile from last added to first added.

相关的是这里的#2。这有点含糊,但我认为文档的另一部分有助于澄清:

Bundler will search for child dependencies of this gem by first looking in the source selected for the parent, but if they are not found there, it will fall back on global sources using the ordering described in SOURCE PRIORITY.

所以听起来你需要提供 rubygems.org 作为后备全局源,如果你希望这样的话,即像你在你的回答。否则,在查找子 gem(依赖项)时,它只会查找为父级提供的源。

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