3

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

  • 如果 gem A 依赖并在 A 的 Gemfile 中声明 github-hosted B
  • B 依赖并在 B 的 Gemfile 中声明 github 托管的 C
  • 然后当我bundle install从A跑...
  • Bundler 应该从 github 获取 B,正如 A 的 Gemfile 中所声明的那样
  • 然后从 github 获取 C,正如 B 的 Gemfile 中所声明的那样

但是 Bundler 抱怨它找不到 C。如果我在 AGemfile中用正确的位置声明 C,那么它就不会抱怨。我是否正确推断 Bundler 实际上根本不查看依赖项Gemfile,而只是查看它们的gemspec?如果我是,是否有比直接在 A 中将 C 声明为 A 的依赖项更好的解决方案来解决我所描述的问题Gemfile

更新:似乎如果您可以在 中声明一个 Github 帐户作为 gem 源Gemfile,那么这个问题就会得到解决。这可能吗?

4

1 回答 1

2

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

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

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

编辑config.ru是这样的:

require "rubygems"
require "geminabox"

Geminabox.data = "gems"
run Geminabox

并将乘客指向 gems/public 文件夹,它将作为一个普通的机架应用程序启动,供您使用。只需将 url 添加到 gemfiles 中的服务并跳过内部 gem 的整个 git 问题,这是我的建议 :)

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

于 2013-07-23T14:53:06.717 回答