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)
部署老系统出现的问题Gem::InstallError: net-ssh requires Ruby version >= 2.0
ERROR: While executing gem ... (Gem::Exception) Unable to require openssl...........................