如何要求分叉的gem lib文件?姓名冲突?

时间:2011-07-18 12:34:42

标签: ruby-on-rails ruby rubygems

我不得不分叉宝石Thor,因为我的cli有一个命令run,这个命令在Thor lib中保留,在.gemspec中更改为millisami-thor如下:

Gem::Specification.new do |s|
...
  s.name = 'millisami-thor'
...
end

并使用它,我将名称millisami-thor下的gem推送到rubygems.org,在我的cli项目的Gemfile中,我放了gem 'millisami-thor', :require => 'thor'

现在,在测试bundle exec cucumber features或试用可执行文件时,只需./bin/executable --params,就可以了。

现在,我使用生成gem build gemname.gemspec gemname.gem的{​​{1}}构建gem,并使用gem install gemname.gem进行安装,并且它和二进制文件一样安装。很好,直到这里。

现在,当我使用像executable --params这样的二进制cmd时,它会查找原始thor库而不是分叉库。

我发现这是由于可执行文件中的require ...

require 'thor'
require 'fileutils'

require 'gemname/cli'

Cf::CLI.start

因为我明确要求原来的thor。 现在,当我将其更改为require 'millisami-thor时,它无法找到并说:

...
custom_require.rb:36:in `require': no such file to load -- millisami-thor (LoadError)
...

在Gemfile中,我可以完成gem 'millisami-thor, :require => 'thor',以便加载分叉的gem。 但是,如果只是require 'millisami-thor'

,我怎么能这样做呢?

我能想到的唯一选择是将所有类名改为'MillisamiThor'而不是'Thor'和文件名。但这太乱了,太丑了。

如果我安装了我的宝石并在之前测试它,我本可以发现它。但我只是在测试环境中,捆绑器需要millisami-thor的{​​{1}}文件,所以直到今天我都没有这个问题。

在没有任何混乱的黑客攻击的情况下,还有其他方法可以实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

您可以保留原始gem设置并将Bundler指向您的git repository fork:

gem 'thor', :git => 'git://github.com/yourname/thor.git', :require => 'thor'

甚至是本地路径

gem 'thor', :path => '/path/to/thor.git', :require => 'thor'