gem 中的 require 问题

Posted

技术标签:

【中文标题】gem 中的 require 问题【英文标题】:Problems with require in gem 【发布时间】:2013-12-26 09:13:13 【问题描述】:

我正在尝试制作一个包含一些模块的简单 gem。但是,在我构建并安装 gem 并尝试在脚本中 require 它之后,我收到一个错误:

from ...ruby-1.9.3-p429/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- my_gem/some_class (LoadError)

from ...ruby-1.9.3-p429/gems/my_gem-0.0.1/lib/my_gem.rb:2:in `<top (required)>'

my_gem.rb 中的第 2 行是 require "my_gem/some_class

据我了解 (from this question),问题似乎是找不到我需要的文件。

发生了什么事?为什么我不能在 gem 中要求我自己的文件?


我想要的文件在 version.rb 的“旁边”。

#File Structure
#
# root
#   |->lib
#   |   |->my_gem.rb
#   |   |->my_gem
#   |   |    |->some_class.rb
#   |   |    |->some_class2.rb
#   |   |    |->version.rb

SomeClass 看起来像这样:

module MyGem
    class SomeClass
        def self.someMethod
        ...
    end
end

我在收到错误的脚本中所做的一切如下:

#!/usr/bin/ruby

require "rubygems"
require "my_gem"

宝石规格:

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

Gem::Specification.new do |spec|
  spec.name          = "my_gem"
  spec.version       = MyGem::VERSION
  spec.authors       = ["My Name"]
  spec.email         = ["my_email@gmail.com"]
  spec.description   = %qA simple Ruby gem that fails.
  spec.summary       = %qFailing gem for Ruby.
  spec.homepage      = "http://some.website.com"
  spec.license       = "MIT"

  spec.files         = `git ls-files`.split($/)
  spec.executables   = spec.files.grep(%r^bin/)  |f| File.basename(f) 
  spec.test_files    = spec.files.grep(%r^(test|spec|features)/)
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.3"
  spec.add_development_dependency "rake"
end

【问题讨论】:

是否找到文件取决于它们的路径。请编辑您的问题,以包含调用文件的文件名和文件夹名称(相对于项目根目录)以及您想要require 的文件。 您是否也向我们提供您的Gemspec:您确定您已包含所有文件吗? 好了。目录结构和 gemspec。也许我在 gemspec 中做错了什么 请从控制台运行git ls-files 并发布结果。你把你所有的类文件都添加到 git 了,不是吗? 嗯,明确的词。我不知道您需要向 git 提交内容才能构建 gem。为什么这个设计决定?如果我想使用 git 以外的东西进行版本控制怎么办? (顺便说一句。随意添加作为答案) 【参考方案1】:

您似乎尚未将类文件添加到git,而您的Gemspec 文件使用通用模式指定要添加到gem 的文件:

spec.files = `git ls-files`.split($/)

您有两个选择可以避免再次遇到同样的麻烦:

在构建 gem 之前将所有文件添加到版本控制中; 在Gemspec 中使用手写的spec.files 列表。

或者,如果您使用的是svn,您可能需要将spec.files 更改为:

spec.files = `svn list`.split($/)

希望对你有帮助。

【讨论】:

很好的解释。不知道 gemspec 正在使用此 git 命令将文件动态添加到 gem。但是,这不能用Dir 命令做得更好吗? 嗯……现在的编码模式很可能将所有需要的东西都置于版本控制之下。 Git 可能是最受欢迎的。使用这种方法,您可以在工作目录中创建一些垃圾/临时内容,而不必担心它们会被打包在您的 gem 中。清理存储库⇒清理 gem。 另外,您可能希望从一个目录树(子文件夹等)生成两个/三个/N 个 gem。所以这些将是 N 个不同的存储库,产生 N 个清晰的 gem,尽管所有代码都存储在一个目录中顶部文件夹。 好吧,如果 gem 使用 git repo 中的文件版本就好了,但它只列出 repo 中存在的文件。因此,您对 gem 所做的所有更改仍将保留在 gem 中,即使它们没有版本化到 gem 中。所以在我看来,这不是一个很好的做法。不过可能还有其他方面我不知道。

以上是关于gem 中的 require 问题的主要内容,如果未能解决你的问题,请参考以下文章

'require':无法加载此类文件'gem'(LoadError)

如果彼此依赖,如何要求ruby gem中的文件

部署老系统出现的问题Gem::InstallError: net-ssh requires Ruby version >= 2.0

ERROR: While executing gem ... (Gem::Exception) Unable to require openssl...........................

Windows 10 x64中的Ruby curb gem问题

application.css.scss 中的 Require 语句