2013-02-23 79 views
1

简单的问题;所以在我的Capistrano的脚本deploy.rb看起来像这样,在那里我可以使用捕获功能轻松:如何从外部静态类访问Capistrano方法?

namespace :mycompany do 
    def some_function() 
     mylog = capture("some_command") 
    end 

    desc <<-DESC 
     some task description 
    DESC 
    task :some_task do 
     mylog = capture("some_command") 
    end 
end 

不过,如果我使用的方法在一个类中,像这样:

namespace :mycompany do 
    class SomeClass 
     def self.some_static_method() 
      mylog = capture("some_command") 
     end 
    end 
end 

它惨不忍睹:

/config/deploy.rb:120:in `some_static_method': undefined method `capture' for #<Class:0x000000026234f8>::SomeClass (NameError) 

如何做到这一点呢?这种方法似乎并不为静态:(这里面这里(Capistrano的来源):

module Capistrano 
    class Configuration 
     module Actions 
      module Inspect 

       # Executes the given command on the first server targetted by the 
       # current task, collects it's stdout into a string, and returns the 
       # string. The command is invoked via #invoke_command. 
       def capture(command, options={}) 
        ... 

回答

1

有人建议使用包括这样:

namespace :mycompany do 
    class SomeClass 
     include Capistrano::Configuration::Actions::Inspect 

     def self.some_static_method() 
      mylog = self.new.capture("some_command") 
     end 
    end 
end 

但是,这里面失败,错误捕获:

/var/lib/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/actions/inspect.rb:34:in `capture': undefined local variable or method `sudo' for #<#<Class:0x00000001cbb8e8>::SomeClass:0x000000027034e0> (NameError) 

所以我压根儿是通过实例作为一个参数(哈克,但它的工作原理)

namespace :mycompany do 
    def some_function() 
     SomeClass.some_static_method(self) 
    end 

    class SomeClass 
     def self.some_static_method(capistrano) 
      mylog = capistrano.capture("some_command") 
     end 
    end 
end 

FML