首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义创业板未加载到rails应用程序

自定义创业板未加载到rails应用程序
EN

Stack Overflow用户
提问于 2017-11-08 17:24:49
回答 1查看 2K关注 0票数 4

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

  • rubygems =未加载
  • github =未加载
  • 局部路径=加载

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

宝石规格在我看来很好:

代码语言:javascript
复制
# 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

其结构如下:

代码语言:javascript
复制
lib/module/gem_name/stuff/others.rb
lib/module/gem_name/extras.rb
lib/module/gem_name.rb

另外,我一直在基于具有相同模块名的其他gem来开发这个gem。但是如果这很重要的话,它会正确地加载到app中。对此有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-11-08 23:51:48

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

代码语言:javascript
复制
% 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中添加:

代码语言:javascript
复制
gem "gem_name", require: "module/gem_name"
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47185973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档