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

标签 ruby git gem rubygems bundler

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

现在,如果 library-aGemfile 如下所示:

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'

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

我已经发布了两个关于此的问题。

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


对于那些说只是不这样做 ...“这是循环依赖”等的人。我理解,但让我们考虑一下。 gem 真的那么复杂吗?它只是具有特定结构的文件。的确,它具有版本信息和关联的“依赖项”——但这些依赖项只需要存在即可。如果合适版本的 gem 已经存在,它应该打破“循环依赖”并说,“嘿,gem 已经在这里,让我们继续前进”。


Bundler 是一个包管理系统;以上不是对象循环依赖,而是文件相互依赖 ...如果它是继承自的对象彼此,绝对……我投降。但这是一个包假设文件系统中存在另一个包的地方。

您可以将词depends 更改为expects the presence of 而不是requires specifically sequential instantiation of

再次 gemspec 工作。如果是 Circular Dependency 那将是不可能的。但是 gemspec 作为包管理系统的一部分的目的更为明确。它让文件成为文件。

gemspec 行为?两颗 gem 需要彼此吗?凉爽的!下载这两个 gem 。简单,完成。 Gemfile 行为?两颗 gem 需要彼此吗?等等,什么?内爆。

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

最佳答案

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

如果 2 个库不能单独存在,最好将它们合二为一。

关于ruby - 如何使用 bundler 创建相互依赖的 gem,并使用存储库作为源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29893470/

相关文章:

git - 是否可以在 git repo 上切换用户?

ruby - nil :NilClass in gem install 的未定义方法大小

ruby - 制作一个不是 gem(或其他类型)的 Ruby 项目

ruby - 如何为 ruby​​ gem 可执行文件创建手册页?

ruby - 为项目指定 ruby​​ 版本

ios - 在 Xcode 中为子模块复制工作副本

git - 如何更改 Git 中的分支点?

ruby - 快速排序实现 : stack level too deep (SystemStackError)

ruby - 为什么我不能用 rbenv 更改我的 ruby​​ 版本?

ruby - 获取类定义之上的所有实例方法