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)

それをどうするか?このメソッドは静的ではないようです:(ここにあります(カピストラーノソース):

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)

したがって、私が単純に行ったことは、インスタンスをパラメーターとして渡すことです (ハックですが、機能します)。

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 に答える