1

我按照本教程创建了一个简单的命令行 gem,现在我想用raad扩展功能。目前,我按照教程进行了以下更改:

垃圾箱/zerp:

#!/usr/bin/env ruby

require 'zerp'

class Zerp    
  def start
    Raad::Logger.debug 'zerp started'

    EventMachine.run do
      EventMachine.add_periodic_timer(1) do
        Raad::Logger.info 'zerp is running'
      end
    end
  end

  def stop
    EventMachine.stop
    Raad::Logger.debug 'zerp stopped'
  end
end

库/zerp.rb:

require 'zerp/version'

require 'eventmachine'
require 'raad'

module Zerp
end

当我从命令行运行客户端时,出现以下错误。

user@zenbook:~/git/zerp :) zerp
/home/user/.local/lib/ry/rubies/1.9.3-p194/lib/ruby/gems/1.9.1/gems/zerp-0.0.1/bin/zerp:5:in `<top (required)>': Zerp is not a class (TypeError)
    from /home/user/.local/lib/ry/current/bin/zerp:23:in `load'
    from /home/user/.local/lib/ry/current/bin/zerp:23:in `<main>'
user@zenbook:~/git/zerp :( 

什么是让这个工作的正确方法?

4

2 回答 2

1

这是我在制作 Raad 时并没有真正考虑过的用例,只需稍加修改即可使其更好地集成到“可执行”gem 上下文中。同时,您可以使用此解决方法:

垃圾箱/zerp

#!/usr/bin/env ruby

begin
  require 'zerp'
rescue LoadError
  $:.unshift 'zerp/lib'
  require 'zerp'
end

# raad must be required after the Zerp class definition
require 'raad'

zerp/lib/zerp.rb

require "zerp/version"
require "zerp/service"

zerp/lib/service.rb

require 'eventmachine'

class Zerp    
  def start
    Raad::Logger.debug 'zerp started'

    EventMachine.run do
      EventMachine.add_periodic_timer(1) do
        Raad::Logger.info 'zerp is running'
      end
    end
  end

  def stop
    EventMachine.stop
    Raad::Logger.debug 'zerp stopped'
  end
end

zerp/lib/版本

module ZerpModule
  VERSION = "0.0.1"
end

Raad 现在的工作方式是,由于需要 raad gem 的文件是“zerp”,因此 Raad 尝试使用“Zerp”类进行引导。为避免冲突,您应该使用“Zerp”以外的其他模块名称——我刚刚选择了“ZerpModule”。

我将尽快修复以使 Raad 在 gem 上下文中更好地集成。

于 2012-07-16T18:40:58.457 回答
0

zerp.rb中,您声明Zerp为模块,但在 中bin/zerp,您将其声明为类。因为它已经是一个模块,所以你不能做你想做的事情。

我只会删除这些module Zerp东西。我也会将class Zerp等放入zerp.rb.

最后,bin/zerp你需要实际调用一些方法。像这样的东西:

zerp = Zerp.new
Process.signal('SIGINT') do 
  zerp.stop
end

zerp.start

不知道你想做什么,这只是一个猜测......</p>

于 2012-07-16T18:04:45.863 回答