如何使用bundler创建相互依赖的gem,并使用存储库作为源?

如何创建相互依赖的gem,仍然使用Bundler?

现在,如果library-a Gemfile如下所示:

 gem 'library-b' gem 'library-c' 

并且library-bGemfile读取如下:

 gem 'library-a' gem 'library-c' 

并且library-cGemfile读取:

 gem 'library-a', github: 'library-root/library-a', branch: 'master' gem 'library-b', github: 'library-root/library-b', branch: 'master' 

当您尝试为library-c运行bundle update和/或bundle install ,这是输出:

 Your Gemfile requires gems that depend depend on each other, creating an infinite loop. Please remove either gem 'library-a' or gem 'library-b' and try again. 

对于library-alibrary-b将发生相同消息的变体。

但是如果你对library-c使用以下内容,并对library-blibrary-a使用相同的样式,这将起作用:

 gem.add_dependency 'library-a' gem.add_dependency 'library-b' 

但是现在,您需要剪切并将gem推送到RubyGems以测试每个版本,尤其是在使用Travis CI时。 如果您使用了Gemfile定义,即使您还使用了gemspec定义,运行或测试的代码也会从git存储库中提取出来,并且可以在不切割和推送gem的情况下最新更新。

我发布了两个有关此事的问题。

  • https://github.com/bundler/bundler/issues/3594
  • https://github.com/bundler/bundler/issues/3597

我需要有相互依赖的gem, 使用git存储库作为gem代码的来源。


对于那些说不做的人 ……“它是Circular Dependency ”等我明白了,但让我们考虑一下。 gem真的那么复杂吗? 它只是具有特定结构的文件。 没错,它有版本信息和“依赖关系”相关联 – 但这些依赖关系只需要存在。 如果已经存在适当版本的gem,它应该突破“循环依赖”并说“嘿,gem已经在这里,让我们向前迈进”然后。


Bundler是一个包管理系统 ; 以上不是对象的 Circular Dependency ,它是文件的 Interdependency …如果它是彼此inheritance的对象,绝对……我投降了。 但是这是一个包假设文件系统中存在另一个包的点。

你可以改变单词depends expects the presence of requires specifically sequential instantiation of

gemspec再次起作用。 如果是Circular Dependency是不可能的。 但作为包管理系统的一部分, gemspec在其目的上更加清晰。 它让文件成为文件。

gemspec行为? 两颗gem都需要彼此? 凉! 下载两个gem。 容易,完成。 Gemfile行为? 两颗gem都需要彼此? 等等,什么? 崩溃。

我想要gemspec “依赖”行为,具有Gemfile源特异性function。 否则我只会继续使用gemspec

Bundler警告你,你的gem具有循环依赖性。 即库-a依赖于库-b,反之亦然。 这是应该避免的情况。

如果没有彼此存在2个库,最好只将它们组合成一个。