我跟着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 :(
使这项工作正常的方法是什么?
答案 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
不知道你想做什么,这只是猜测...