如何在Bundler中使用“gemspec”规则,同时仍然使用gem的本地签出?

时间:2010-12-14 14:34:55

标签: ruby rubygems gem bundler

场景:我正在使用Bundler开发一个gem gem-foo。我依赖于gem-bar,我已在本地检查以进行开发。我可以在Gemfile中将此依赖关系声明为:

gem "gem-bar", :path => "/path/to/local/gem-bar"

然而,在开发宝石时,“最佳实践”似乎是通过gem-foo.gemspec来定义所需的宝石:

s.add_runtime_dependency 'gem-bar'

然后使用:

简单地在Gemfile中包含依赖项
gemspec

我想要做的是在gemspec中添加对gem的运行时依赖性,但是对gem-bar进行一些本地修改并让bundle install使用本地开发结帐。假设我控制两个宝石的情况,并且在某种程度上同时攻击它们,我将同时推动新版本。我可以只注释掉gemspec中的s.add_runtime_dependency并将其添加到Gemfile中的本地路径,但感觉......容易出错? gemspec 应该总是声明这个依赖项,并且Gemfile应该能够覆盖Bundler应该用于gem的位置。但是,如果您实际执行此操作,则会收到以下错误:

  

您不能指定来自不同来源的同一个宝石两次。您指定gem-bar(> = 0)应来自未指定的来源和/ path / to / local / gem-bar

理想情况下,我只是有一些本地覆盖,因为我从来不想要在特定路径上不小心推动宝石需要本地gem-bar的情况。那会很蠢。

有没有人能够很好地解决这个用例?

3 个答案:

答案 0 :(得分:15)

有几个人发现了这个问题,Yehuda Katz说他很乐意接受补丁:http://groups.google.com/group/ruby-bundler/browse_thread/thread/d4215c4930a63ffc?pli=1

作为最好的解决方法,请在gemfile中注释掉gemspec行并遭受一些重复?

<强>更新

看起来你不必等待 - https://github.com/carlhuda/bundler/commit/03378109d

提交消息: “可以覆盖Gemfile中的.gemspec依赖项源代码”

万岁!

答案 1 :(得分:2)

目前,我所做的是在设置给定环境变量时禁用gemspec中的gem要求,然后在Gemfile中添加指向我本地文件系统的gem定义。

我在这里写了我的整个工作流程:http://numbers.brighterplanet.com/2010/07/28/bundler-to-the-max/ 注意:我也使用珠宝商,这使事情变得非常复杂。

答案 2 :(得分:1)

男孩!我从来没有按时到达这些吗?尝试Bundler选项,比如 - 我不记得的东西。