• Capistrano3のタスク内でトップレベルのタスク名を取得する

    Capistrano3でタスク書いていて、タスク内でcapコマンドとして実行されたトップレベルのタスク名を引いて、処理を分岐させる必要が生じて、そのトップレベルのタスク名取得に苦労したので、ここに備忘録化しておく。

    基本的にCapistrano3でタスク内で自分のタスク名を取得したい場合、次のようにブロックの引数として引ける。

    desc "main task"
    task :main_task => :sub_task do |task|
        run_locally do
            info ": This task name: #{task}"
            info ": Running main deploy task!"
        end
    end
    
    desc "sub task"
    task :sub_task do |task|
        run_locally do
            current_task = task.name_with_args.split(':').last
            info ": This task name: #{current_task}"
        end
    end
    

    上記タスクを実行してみると、こうなる。

    $ cap test deploy:main_task
    INFO: This task name: sub_task
    INFO: This task name: deploy:main_task
    INFO: Running main deploy task!
    

    ただ、デプロイの共通設定を読み込むとかのサブタスクを作って、全てのメインタスクの前にそのサブタスクを実行するようなタスクチェーンを構築した場合に、特定のメインタスクが実行された時のみ、サブタスクの一部処理を分岐させたいとかの要望が発生すると、サブタスク内でメインタスクのタスク名を取得する必要が出てくる。つまりは、capコマンドで実行されるトップレベルタスク(例で言うところのメインタスク)を取得したいのだが、これがなかなかTIPSが見つからなくて実現するのに苦労した。 Capistranoのタスク処理は、コアで使われているRakeクラスで実現されているので、そのRakeクラスのApplicationメソッドから取得する必要があった。

    ...