我已将宝石推入github& rubygems,但该gem的常量未加载到rails应用程序中。通过从多个来源加载来尝试这一点,结果如下:
有趣的是,当我使用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。但如果这很重要,它会正确加载到应用程序中。 关于这个的任何想法?
答案 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"