我不得不分叉宝石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}}文件,所以直到今天我都没有这个问题。
在没有任何混乱的黑客攻击的情况下,还有其他方法可以实现这一目标吗?
答案 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'