1

cap タスク内で使用する Capistrano のカスタム メソッドを定義しようとしています。Capistrano が例外をスローするため、メソッドを定義し、そのようなメソッドを名前空間付きのタスクから呼び出そうとするまで、タスク内で問題なく使用できます。

capturecmdnamespaced task から呼び出されたときに Capistranoという名前のカスタム コマンドが中断するサンプル トレースfile:replace。名前空間のないタスクに対しては完全に正常に動作します。

#⚡ cap local file:replace -s dir=./jel-ids/ -s f=deploy -s r=deployed -s ext=.bak
  * 2013-02-13 13:34:08 executing `local'
  * 2013-02-13 13:34:08 executing `file:replace'
Capfile:129:in `capturecmd': uninitialized constant Capistrano::Configuration::Open3 (NameError)
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/namespaces.rb:191:in `method_missing'
    from Capfile:41:in `block (2 levels) in load'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/execution.rb:138:in `instance_eval'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/execution.rb:138:in `invoke_task_directly'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/callbacks.rb:25:in `invoke_task_directly_with_callbacks'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/execution.rb:89:in `execute_task'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/configuration/execution.rb:101:in `find_and_execute_task'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/cli/execute.rb:46:in `block in execute_requested_actions'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/cli/execute.rb:45:in `each'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/cli/execute.rb:45:in `execute_requested_actions'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/cli/help.rb:19:in `execute_requested_actions_with_help'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/cli/execute.rb:34:in `execute!'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/lib/capistrano/cli/execute.rb:14:in `execute'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/lib/ruby/gems/1.9.1/gems/capistrano-2.14.2/bin/cap:4:in `<top (required)>'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/bin/cap:23:in `load'
    from /usr/local/opt/rbenv/versions/1.9.3-p385/bin/cap:23:in `<main>'

編集:さらに、誰かがカピストラーノを拡張するための適切な構造を提案できる場合は、私のカスタムメソッドが、、などの既存のメソッドと同じレベルに存在できるようにしrunますcapture.

4

1 に答える 1

3

私はそれを必要としたことはありませんが、これが取引です。にいる場合Capfileselfはのインスタンスへの参照ですCapistrano::Configuration。あなたはあなたので次のコードを使用することによってそれを見ることができますCapfile

p self.class

のスコープでは、メソッドselfにアクセスできます。次を返します。runp self.methods.grep :run

[:run]

したがって、と同じスコープのメソッドが必要な場合はrun、自分で定義を行うことができます。

def self.my_method
  puts "let's go!"
end

私が言ったように、これがそれを行うための最良の方法であるかどうかはわかりませんが、これは機能します。これで、次のような名前空間タスクを作成できます。

namespace :borba do
  task :teste do
    my_method
  end
end
于 2013-02-13T21:34:19.417 に答える