过去,基于风格决定,我创建了使用包含破折号的使用名称的宝石:
foo-bar
但是,lib
下的文件夹结构看起来更像是这样:
lib
foo_bar.rb
如果我在另一个项目的Gemfile中使用我自己的一个宝石,Bundler并不自动要求该库。如果我在另一个项目的Gemfile中使用我的一个单词gems(例如bundy
),那么auto-require就可以了。
基于使用Bundler创建的gem项目的默认结构,我猜测Bundler正在尝试要求lib/foo/bar.rb
的内容。我不知道,宝石似乎期待一个' - '在宝石名称中与' /'在路径名称中。
如果我希望Bundler需要lib/foo_bar.rb
怎么办?可以不用这样做:
答案 0 :(得分:2)
查看Bundler代码,我发现auto-require路径来自以下两个地方之一:
宝石本身的名称。
#/lib/bundler/dependency.rb
...
if options.key?('require')
@autorequire = Array(options['require'] || [])
end
...
和
#/lib/bundler/runtime.rb
...
if dep.autorequire.nil? && dep.name.include?('-')
begin
namespaced_file = dep.name.gsub('-', '/')
Kernel.require namespaced_file
rescue LoadError => e
REQUIRE_ERRORS.find { |r| r =~ e.message }
raise if $1 != namespaced_file
end
end
...
这将使用'/'替换gem名称中的-
个字符,就像我从实验中找到的那样。从它的外观来看,如果遇到尝试要求转换的gem名称的require错误,它也会吞下异常。 (它会为其他人重新抛出,所以如果gem的内部依赖性被破坏,可能会失败。)
我找不到任何其他设置autorequire文件的机制,所以我不情愿地必须使用我的第二个选项:在Bundler期望的位置添加一个额外的文件,这需要我需要的文件。
答案 1 :(得分:-1)
如果您要创建gem,最好在.gemspec
文件中包含您所依赖的gem
Gem::Specification.new do |spec|
...
spec.add_dependency "gem-name-whatev", "~> 1.5" # just like Gemfile
spec.add_development_dependency "other-gem"
...
end