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コンテキスト内でより適切に統合できるようになります。それまでの間、次の回避策を使用できます。

bin / 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 / version

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宣言しますが、ではクラスとして宣言します。すでにモジュールなので、やろうとしていることはできません。Zerpbin/zerp

私はただものを取り除くでしょうmodule Zerpclass Zerpetcも に入れzerp.rbます。

最後に、bin/zerpいくつかのメソッドを実際に呼び出す必要があります。このようなもの:

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

zerp.start

何をしようとしているのかはわかりませんが、それは単なる推測です…</p>

于 2012-07-16T18:04:45.863 に答える