如何使用bundler创建相互依赖的gem,并使用存储库作为源?
如何创建相互依赖的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'
但是现在,您需要剪切并将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个库,最好只将它们组合成一个。