2012-07-12 69 views
1

我跟着this tutorial創建了一個簡單的命令行gem,現在我想用raad擴展功能。在cli gem中使用raad和eventmachine

斌/ 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 

當我從客戶端運行命令行我得到以下錯誤。

[email protected]:~/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>' 
[email protected]:~/git/zerp :( 

什麼是正確的方法來得到這個工作?

+0

我只會用'Process.daemon'和'optparse'去代替'raad'。 – pkhamre 2012-07-12 20:42:46

回答

1

這是一個用例我真的不看製作拉德當且僅輕微的修改將製作成它更好地集成在「可執行」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寶石的文件是「zerp」然後拉德嘗試使用「Zerp」類來引導。爲避免衝突,您應該使用另一個模塊名稱而不是「Zerp」 - 我只是選擇了「ZerpModule」。

我會盡量做一個修復,讓Raad在gem環境下更好地集成。

+0

非常感謝,我利用你的幫助獲得了工作。 – pkhamre 2012-07-16 20:28:36

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 

不知道你正在嘗試做的,這只是一個猜測...