umbrellaのroot directoryでtestを実行して、application directoryの中にあるテストが実行される理由がわかってなかったので調べた。
結論
- apps以下のアプリケーションに対してもmix taskが実行されるかはtask次第
- task moduleのattributeに@recursive trueがついていたら実行される
メモ
-
http://elixir-lang.org/getting-started/mix-otp/dependencies-and-umbrella-apps.html#umbrella-projects
- 上記を見る限り、mix.exsのproject設定の中にapps_pathがあったらumbrella projectだと認識するらしい
- ってことはmixが処理する際になんかしてるはず
- https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/project.ex#L227-L229
-
https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/task.ex#L28
- task moduleの@recursive attributeがtrueだった場合、umbrella projectではapps_pathの下のapplicationにも再帰的にtaskを実行しそう
- https://github.com/elixir-lang/elixir/blob/939210f98a8fb18d3fcf3fa72213b405ffe0ebc2/lib/mix/lib/mix/task.ex#L289
- mix testも@recursive trueがついてる
- 関係ないけど https://github.com/wojtekmach/acme_bank がumbrellaの利用例として理解がはかどった。