如何创建相互依赖的 gem,并且仍然使用 Bundler?
现在,如果 library-a
的 Gemfile
如下所示:
gem 'library-b'
gem 'library-c'
library-b
的 Gemfile
如下所示:
gem 'library-a'
gem 'library-c'
library-c
的 Gemfile
读取:
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-a
或 library-b
将发生相同消息的变体。
但是如果你对library-c
使用下面的样式,并且对library-b
和library-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/