【问题标题】:gem which cannot find gem despite it being installed尽管已安装 gem,但无法找到 gem
【发布时间】:2021-03-12 04:01:46
【问题描述】:

我已经构建了我的第一个 gem,但我似乎无法正确安装它。我可以发出命令

sudo gem install ceilingfish-toto

哪个产生输出

Successfully installed ceilingfish-toto-0.3.6
1 gem installed

但是当我输入gem which ceilingfish-toto 时。我得到了输出

Can't find ruby library file or shared library ceilingfish-toto

这很奇怪,因为如果我去查看我的 gems 文件夹,我可以看到那里安装的所有文件

# ls -l /opt/local/lib/ruby/gems/1.8/gems/ceilingfish-toto-0.3.6/
total 48
-rw-r--r--  1 root  admin  1053 14 Feb 17:16 LICENSE
-rw-r--r--  1 root  admin  6166 14 Feb 17:16 README.md
-rw-r--r--  1 root  admin   879 14 Feb 17:16 Rakefile
-rw-r--r--  1 root  admin     6 14 Feb 17:16 VERSION
-rw-r--r--  1 root  admin  2477 14 Feb 17:16 ceilingfish-toto.gemspec
drwxr-xr-x  7 root  admin   238 14 Feb 17:16 test

有人知道是什么原因造成的吗?我认为这是在抱怨,因为 gem 名称中有一个连字符。你可以在这里查看 gemspec http://github.com/ceilingfish/toto

【问题讨论】:

  • 嗯,确实没有ceilingfish-toto 文件或共享库。

标签: ruby gem


【解决方案1】:

不是连字符。

gem which 搜索 gems 中的库文件,而不是 gems。比较:

$ gem which haml
/home/dave/.gem/ruby/1.8/gems/haml-3.0.12/lib/haml.rb
$ ls haml-3.0.12/lib/h*
haml  haml.rb  haml.rbc

桃色。注意lib/haml.rb 的存在。

$ gem which rails
ERROR:  Can't find ruby library file or shared library rails
$ ls rails-2.3.8/lib/r*
rails_generator.rb  railties_path.rb  rubyprof_ext.rb  ruby_version_check.rb

没有lib/rails.rb。但是试试:

$ gem which railties_path # not a gem
/home/dave/.gem/ruby/1.8/gems/rails-2.3.8/lib/railties_path.rb

所以即使安装了ceilingfish-totogem which ceilingfish-toto 也会抛出错误,因为没有lib/ceilingfish-toto.rb 文件(甚至没有lib 文件夹)。

【讨论】:

    【解决方案2】:

    gem which ceilingfish-toto 在 gem 的 require 路径中查找一个名为 ceilingfish-toto.rb 的文件。由于没有一个,它什么也不返回。 gem which toto 对您有用,但由于您的 gem 规范中不包含 lib/,因此未安装 lib 文件,因此它不存在。

    重新运行 rake gemspec 可能会解决问题。

    顺便说一句,您可以通过使用 gem list ceilingfish-toto 来检查 gem 是否按其名称安装,这应该显示它已安装,无论它具有什么文件(它还会列出已安装的版本)。

    【讨论】:

    • 对于'gem list',使用-d作为“details”:gem list -d ceilingfish-toto查看它的安装位置。
    【解决方案3】:

    根据gem naming recommendations

    如果您要向另一个 gem 添加功能,请使用破折号。这通常对应于 require 语句中的 / (因此你的 gem 的目录结构)和你的主类或模块名称中的 ::。

    如果是这种情况,如果您的 gem 命名为 alpha-beta,您需要在 gem which 命令中添加一个斜杠 (/)

    gem which alpha/beta
    

    【讨论】:

    • 这真是一团糟。它应该自动执行此操作。只是浪费了 1/2 小时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2015-08-03
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多