场景:我正在使用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
的情况。那会很蠢。
有没有人能够很好地解决这个用例?
答案 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选项,比如 - 我不记得的东西。