自定义宝石没有加载到rails app

时间:2017-11-08 17:24:49

标签: ruby-on-rails ruby rubygems

我已将宝石推入github& rubygems,但该gem的常量未加载到rails应用程序中。通过从多个来源加载来尝试这一点,结果如下:

  • ruby​​gems =未加载
  • github =未加载
  • local path = loaded

有趣的是,当我使用rubygems / github加载时,我可以使用require 'module/gem_name'加载常量

gemspecs对我来说很好看:

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'module/gem_name/version'

Gem::Specification.new do |spec|
  spec.name          = 'gem_name'
  spec.version       = Module::GemName::VERSION
  spec.authors       = ['Mike QWERTY']
  spec.email         = ['mike.qwerty@gamil.com']

  spec.summary       = 'some_desc'
  spec.homepage      = 'https://github.com/mike/gem-name'
  spec.license       = 'MIT'

  if spec.respond_to?(:metadata)
    spec.metadata['allowed_push_host'] = 'https://rubygems.org'
  else
    raise 'RubyGems 2.0 or newer is required to protect against public gem pushes.'
  end

  spec.files = `git ls-files -z`.split("\x0").reject do |f|
    f.match(%r{^(test|spec|features)/})
  end
  spec.bindir        = 'exe'
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ['lib']
  spec.required_ruby_version = '>= 2.4.0'
  spec.add_runtime_dependency 'graphql', '>= 1.6.0'

  spec.add_development_dependency 'bundler', '~> 1.14'
  spec.add_development_dependency 'rake', '~> 10.0'
  spec.add_development_dependency 'rspec', '~> 3.0'
end

结构是:

lib/module/gem_name/stuff/others.rb
lib/module/gem_name/extras.rb
lib/module/gem_name.rb

另外,我一直在研究这个基于具有相同模块名称的其他gem的gem。但如果这很重要,它会正确加载到应用程序中。 关于这个的任何想法?

1 个答案:

答案 0 :(得分:1)

gem不是自动加载的,因为主文件(gem_name.rb)不在lib目录的根目录下。建议您的Gem遵循以下结构:

% tree
.
├── gem_name.gemspec
└── lib
    ├── gem_name
    │   └── some_file.rb
    │   └── other_file.rb
    └── gem_name.rb

你的额外module嵌套。在您的Rails application.rb中,您应该看到Bundler.require(*Rails.groups)。这个method做的是循环遍历Gemfile中的每个Gem并调用require gem_name。这适用于符合上述惯例的Gem。你的宝石没有 - 所以Bundler完成的自动要求找不到正确的文件。

有关正确代码组织的更多信息,请参阅Ruby Gems Guide创建自己的Gem。

如果您不想更改应用程序的结构,请添加 require "module/gem_name"在初始化程序中,或在Gemfile中:

gem "gem_name", require: "module/gem_name"