1

简单的问题;所以我在 capistrano 中的 deploy.rb 脚本看起来像这样,我可以轻松地使用捕获功能:

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={})
                    ...
4

1 回答 1

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)

所以我所做的只是将实例作为参数传递(hacky 但它有效)。

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

于 2013-02-23T20:44:41.983 回答