在cli gem中使用raad和eventmachine

时间:2012-07-12 17:30:53

标签: ruby gem command-line-interface eventmachine

我跟着this tutorial创建了一个简单的命令行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

LIB / 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 :( 

使这项工作正常的方法是什么?

2 个答案:

答案 0 :(得分: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环境中更好地集成。

答案 1 :(得分: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

不知道你想做什么,这只是猜测...