Ruby on rails 自定义gem未加载到rails应用程序

Ruby on rails 自定义gem未加载到rails应用程序,ruby-on-rails,ruby,rubygems,Ruby On Rails,Ruby,Rubygems,我已经将gem推到github&rubygems中,但该gem的常量并没有加载到rails应用程序中。尝试从多个源加载,结果如下: rubygems=未加载 github=未加载 本地路径=已加载 有趣的是,当我使用rubygems/github加载时,我可以使用require'module/gem\u name' 在我看来,gemspecs很不错: # coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.u

我已经将gem推到github&rubygems中,但该gem的常量并没有加载到rails应用程序中。尝试从多个源加载,结果如下:

  • rubygems=未加载
  • github=未加载
  • 本地路径=已加载
有趣的是,当我使用rubygems/github加载时,我可以使用
require'module/gem\u 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。但若这很重要,它会正确加载到应用程序中。
有什么想法吗?

由于主文件(
gem\u name.rb
)不在
lib
目录的根目录下,所以gem没有自动加载。建议您的创业板遵循以下结构:

% tree
.
├── gem_name.gemspec
└── lib
    ├── gem_name
    │   └── some_file.rb
    │   └── other_file.rb
    └── gem_name.rb
您有一个额外的
模块
嵌套。在Rails
application.rb
中,您应该看到
Bundler.require(*Rails.groups)
。这样做的目的是循环遍历Gem文件中的每个Gem,并调用
requiregem\u name
。这适用于遵循上述约定的Gem。您的gem没有-因此Bundler执行的自动请求找不到要使用的正确文件

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

如果不想更改应用程序的结构,请添加
在初始值设定项中或gem文件中要求“模块/gem\u名称”

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

如果将
require'module/gem_name'
粘贴在
application.rb的顶部,它是否工作?是。我想知道为什么它不能自动加载。嘿,谢谢你的回答。我知道如何在Gemfile中使用额外的require来实现这一点,但请看一下这一点:。不需要任何额外的东西,而且它是开箱即用的。我遗漏了什么吗?你认为回购协议的名称必须与gem_名称的价值相同吗?