构建Ruby gem时,如何指定Bundler应该需要哪些文件?

时间:2015-06-29 13:34:04

标签: ruby gem rubygems bundler require

过去,基于风格决定,我创建了使用包含破折号的使用名称的宝石:

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怎么办?可以不用这样做:

  • 更改宝石的名称? (有些宝石在我不再工作的公司拥有的项目中使用,所以我不想这样做。)
  • 添加无关文件进行管理包括? (似乎凌乱和不专业。)
  • 向' gem'添加明确的要求在Gemfile中声明? (似乎不专业。)

2 个答案:

答案 0 :(得分:2)

查看Bundler代码,我发现auto-require路径来自以下两个地方之一:

  • Gemfile中的'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