我已经将gem推到github & rubygems中,但是gem的常量并没有加载到rails应用程序中。通过从多个源加载来尝试这样做,结果如下:
有趣的是,当我用rubygems/github加载时,我可以用require 'module/gem_name'加载常量
宝石规格在我看来很好:
# 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。但是如果这很重要的话,它会正确地加载到app中。对此有什么想法吗?
发布于 2017-11-08 23:51:48
gem没有自动加载,因为主文件(gem_name.rb)不在lib目录的根目录。建议您的宝石遵循以下结构:
% tree
.
├── gem_name.gemspec
└── lib
├── gem_name
│ └── some_file.rb
│ └── other_file.rb
└── gem_name.rb你的有一个额外的module嵌套。在Rails application.rb中,您应该看到Bundler.require(*Rails.groups)。这个方法所做的是遍历Gemfile中的每个Gem并调用require gem_name。这适用于遵循上述惯例的Gem。您的创业板没有-所以自动要求由邦德勒完成没有找到正确的文件使用。
有关正确的代码组织的更多信息,请参见创建自己的Gem的红宝石指南。
如果不想更改应用程序的结构,可以在初始化程序中添加require "module/gem_name",或者在Gemfile中添加:
gem "gem_name", require: "module/gem_name"https://stackoverflow.com/questions/47185973
复制相似问题