1

我通过以下方式创建了一个简单的宝石:

  1. testgem.gemspec

    Gem::Specification.new do |s|
      s.name = 'testgem'
      s.version = '0.0.1'
      s.summary = "code generation"
      s.authors = ['asdf']
    end
    
  2. 创建了以下文件布局:

    testgem.gemspec
    Gemfile
    lib/
    lib/testgem.rb
    lib/testgem/other.rb
    
  3. 运行以下内容:

    gem build testgem.gemspec
    
    WARNING:  no description specified
    WARNING:  no email specified
    WARNING:  no homepage specified
    Successfully built RubyGem
    Name: testgem
    Version: 0.0.1
    File: testgem-0.0.1.gem
    
  4. 安装它:

    gem install ./testgem-0.0.1.gem 
    Successfully installed testgem-0.0.1
    1 gem installed
    
  5. 测试 irb 是否可以看到:

    irb
    require 'testgem'
    oadError: cannot load such file -- testgem
    

我正在使用 Ruby 1.9.3-p194

如果我这样做,它似乎已安装:

gem list
..
testgem (0.0.1)
..

可能是什么问题?

4

3 回答 3

3

您需要将您的库添加到搜索路径。只需添加

$:.push File.expand_path("../lib", __FILE__)

在您的 .gemspec 之上

于 2012-09-25T04:08:43.687 回答
1

当您require在 Ruby 中使用时,您正在尝试加载文件,而不是gem。该文件当然可以包含在 gem 中,按照惯例,gem 将具有与 gem 本身同名的文件,因此如果您想使用 gem foo,您可以使用require 'foo'. 但情况并非总是如此,例如使用bcrypt-ruby您需要的 gem require 'bcrypt'

此外,宝石不一定必须包含任何填充物。gem就是一个例子rails,它本身不包含任何文件(至少在 3.2 版中),但依赖于各种 Rails 组件,因此您可以一步安装它们。

在您的情况下,虽然您lib/testgem.rb的 gems 项目目录中有一个文件,但您并没有将它包含在您的 gem 中。您需要指定应包含哪些文件,默认为不包含任何内容。

要简单地将所有文件包含在项目目录中,您可以添加如下内容:

s.files = Dir.glob '**/*'

到你的 gemspec。

于 2012-09-23T22:05:11.470 回答
-1

你需要require 'rubygems'先。

于 2012-09-23T21:00:08.967 回答