2016-05-06 [長年日記]
_ Capistrano3.5でafter hookを書いたときの探索の仕様が変わってた
Capistrano3.5でafter hook を書いたときの探索する名前空間の仕様が変わった模様。
https://github.com/capistrano/capistrano/issues/1652
今回、namespace :deploy
の中で after :deploy, :notify do ... end
で登録している部分が動かなくなった。
after hook を書くと、以下が実行されます。
https://github.com/capistrano/capistrano/blob/v3.5.0/lib/capistrano/dsl/task_enhancements.rb#L10
ここで2つの処理が行われます。
- Rake::Task.define_task でRakeタスクとしてcapistranoタスクが登録される (ブロック付きで呼び出された場合。)
- ちなみに登録されたタスクは Rake::Task.tasks で確認できる。
- Rake.application.lookup(post_task, task.scope) で実行するタスクを探してキューに積む(たぶん)
namespace :deploy
の中で after :deploy, :notify do ... end
で登録している部分が動かない。deploy:notify という名前でRakeタスクが登録されるけど、探しにいってるのは :notify になってしまうようだ。そのため Rake.application.lookup(post_task, task.scope) が見つからずにnilになり、それにinvokeメソッドを呼んで ArgumentError: wrong number of arguments (0 for 1+)
エラーになる。
これが起こるのは namespace と after の第1引数が両方deploy になって、かつ、ブロックを渡しているケースだけ。after のトリガーを :deploy から deploy:finished へ変更したら動いた。これ、トリガーに :deploy を使うなって話と、名前空間 :deploy を使うなって話なのかな。