【问题标题】:Making a Ruby Gem - Cannot Load Such File制作 Ruby Gem - 无法加载此类文件
【发布时间】:2015-03-03 15:37:19
【问题描述】:

我正在尝试使用http://guides.rubygems.org/make-your-own-gem/ 的说明构建一个 Ruby gem。以下似乎工作正常,并生成了一个 *.gem 文件。

gem build mygem.gemspec

以下似乎也是成功的(仅当以 sudo 开头时):

sudo gem install mygem-0.0.1.gem

但是,当我尝试在 irb 中 require 'mygem' 时,我收到以下错误:

LoadError: cannot load such file -- mygem

我在 Stackoverflow 上看到过类似的错误,但无法弄清楚在我的具体情况下出了什么问题。我可以毫无问题地要求其他宝石(不是我的)。我的 gem 确实出现在 gem list 的输出中,但它不会被 require 加载。

FWIW 我正在使用 rbenv,这对我来说是全新的。

这是gem env的输出:

  • RUBYGEMS 版本:2.4.5

    • RUBY 版本:2.1.5(2014-11-13 补丁级别 273)[x86_64-darwin14.0]

    • 安装目录:/Users/speersj/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0

    • RUBY 可执行文件:/Users/speersj/.rbenv/versions/2.1.5/bin/ruby

    • 可执行目录:/Users/speersj/.rbenv/versions/2.1.5/bin

    • SPEC 缓存目录:/Users/speersj/.gem/specs

    • 系统配置目录:/Users/speersj/.rbenv/versions/2.1.5/etc

    • RUBYGEMS 平台:

    • 红宝石

    • x86_64-darwin-14

    • 宝石路径:

      • /Users/speersj/.rbenv/versions/2.1.5/lib/ruby/gems/2.1.0

      • /Users/speersj/.gem/ruby/2.1.0

    • 宝石配置:

      • :update_sources => 真

      • :verbose => true

      • :backtrace => 假

      • :bulk_threshold => 1000

    • 远程源:

    • 外壳路径:

      • /Users/speersj/.rbenv/versions/2.1.5/bin

      • /Users/speersj/.rbenv/libexec

      • /Users/speersj/.rbenv/plugins/ruby-build/bin

      • /Users/speersj/.rbenv/shims

      • /Users/speersj/.rbenv/bin

      • /Library/Frameworks/Python.framework/Versions/3.4/bin

      • /usr/local/bin

      • /usr/local/sbin

      • /usr/local/heroku/bin

      • /usr/local/bin

      • /usr/bin

      • /bin

      • /usr/sbin

      • /sbin

      • /usr/local/bin

      • /usr/local/smlnj/bin

宝石规格:

Gem::Specification.new do |spec|
    spec.name        = 'mygem'
    spec.version     = '0.0.1'
    spec.date        = '2015-01-05'
    spec.summary     = "mygem" 
    spec.description = "Attempting to build a gem"
    spec.authors     = ["speersj"]
    spec.email       = # my email here
    spec.files       = ['lib/command.rb', 'lib/connection.rb']
    spec.homepage    = ''
    spec.license     = 'MIT'
end

【问题讨论】:

  • lib 目录的内容是什么?您的 gem 是否有一个名为 mygem 的文件?
  • lib 包含几个定义类的文件,还包括一个 mygem.rb 文件,它需要 lib 中的其余文件。
  • 尝试在没有sudo的情况下安装gem?
  • 你的gemspec是什么样的?
  • 不要使用sudo 来安装带有 rbenv(或 RVM)的 gem。这样做会导致 gem 安装在默认系统 Ruby 中,而不是 rbenv 管理的 Ruby 中。

标签: ruby gem


【解决方案1】:

gemspecspec.files 条目不包含 mygem.rb 文件,因此该文件在构建时不会出现在 gem 中。只有此条目中列出的文件才会包含在最终 gem 中。

最简单的解决方案是将mygem.rb 添加到数组中:

spec.files = ['lib/command.rb', 'lib/connection.rb', 'lib/mygem.rb']

这是一个相当简单的修复,您可能想做一些更灵活的事情,比如使用Dir glob

spec.files = Dir['lib/**/*.rb']

实际上是Rubygems guide suggests you do something like this(文本来自该部分的末尾):

如果您向 gem 添加了更多文件,请务必记住在发布新 gem 之前将它们添加到 gemspec 的 files 数组中!出于这个原因(以及其他原因),许多开发人员使用 HoeJewelerRakeBundlerjust a dynamic gemspec 自动执行此操作。


另外,您确实需要修复您的 permissions problem,您不需要 sudo 将 gems 安装到您自己的主目录中。

【讨论】:

  • 谢谢,我完全错过了添加最明显的文件!从现在开始 Dir glob。感谢您帮助我指出正确的方向:权限,对我来说必须使用 sudo 似乎不对。
【解决方案2】:

在使用 rbenv(或 RVM)时,您不能使用 sudo 来安装 gem,除了“多用户”或“系统范围”类型的安装,它们是专门的,很少有普通/普通用户使用应该使用。

sudo 将您的权限提升为 root,而 root 不知道用户 rbenv 环境中的 Rubies。因此,root 将使用默认系统 Ruby,它将文件安装在那里。

改为使用基本的gem install,它会做正确的事情。

【讨论】:

    【解决方案3】:

    确保在构建 gem 之前将所有修改后的文件添加到 github repo 中,然后安装构建 gem。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 2014-10-09
      • 2015-01-22
      • 2012-10-25
      • 2012-02-27
      • 2013-09-30
      • 1970-01-01
      • 2013-11-04
      相关资源
      最近更新 更多