制作 Ruby Gem - 无法加载此类文件

Making a Ruby Gem - Cannot Load Such File

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

gem build mygem.gemspec

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

sudo gem install mygem-0.0.1.gem

但是,当我尝试 require 'mygem' inside irb 时,出现以下错误:

LoadError: cannot load such file -- mygem

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

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

这是gem env的输出:

宝石规格:

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

在使用 rbenv(或 RVM)时不能使用 sudo 来安装 gem,除了专门的 "multi-user" 或 "system-wide" 类型安装normal/regular 用户应该使用的很少。

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

相反,使用基本的 gem install,这会做正确的事。

您的 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(文本来自该部分的末尾):

If you’ve added more files to your gem, make sure to remember to add them to your gemspec’s files array before publishing a new gem! For this reason (among others), many developers automate this with Hoe, Jeweler, Rake, Bundler, or just a dynamic gemspec.


此外,您确实需要修复 ,您不需要 sudo 将 gem 安装到您自己的主目录中。

确保在构建 gem 之前将所有修改过的文件添加到 github 存储库中,然后安装构建 gem.