如何使Bundler识别间接依赖的位置声明?

时间:2013-06-10 04:51:08

标签: ruby bundler

我正在一个小团队工作,并开发了几种供内部使用的宝石。这些宝石是各种相互依赖的,并托管在我的Github帐户上。当我声明对这些宝石的依赖时,我总是声明Gemfile:git => 'url/for/gem/on/github'。但是我遇到了Bundler的一些令人困惑的行为 - 我认为:

  • 如果gem A依赖并在A的Gemfile中声明github托管的B
  • 和B依赖于并在B的Gemfile中声明github托管的C
  • 然后我从A ...
  • 运行bundle install
  • Bundler应该从github中获取B,如A的Gemfile中所声明的那样
  • 然后从github获取C,如B的Gemfile
  • 中所声明的那样

但是Bundler抱怨它无法找到C.如果我在A Gemfile中使用正确的位置声明C,那么它就不会抱怨。我是否正确地推断Bundler实际上并没有真正关注依赖Gemfile,而只是看看他们的gemspec?如果我是,对于我描述的问题是否有更好的解决方案,而不是直接在A Gemfile中将C声明为A的依赖?

更新:似乎如果你可以在Gemfile中声明一个Github帐户作为宝石来源,那么这个问题就可以解决了。这可能吗?

1 个答案:

答案 0 :(得分:2)

我们最近不得不解决与内部宝石相互依赖的非常相似的情况。我们已经使用了内部git主机(GitLab),但是在gemspec中无法声明包样式git:branch:属性时遇到了同样的问题。

我们的解决方案是设置内部宝石托管。使用geminabox它真的很容易让gem主机启动并运行。运行gem install geminabox并为您的网络服务创建一个文件夹(我们使用乘客,ymmw):

gems/
  public/
  tmp/
    restart.txt
  gems/
  config.ru

编辑config.ru就像这样:

require "rubygems"
require "geminabox"

Geminabox.data = "gems"
run Geminabox

并指向乘客在宝石/公共文件夹中,它将作为正常的机架应用程序启动,供您玩。只需将网址添加到gemfiles中的服务并跳过内部gems的整个git问题,这是我的建议:)

有关geminabox的更多信息可以在他们的github页面上找到:https://github.com/geminabox/geminabox