mike-neckのブログ

Java or Groovy or Swift or Golang

Rule Based Model Configurationの @ Mutate フェーズ実装のベタープラクティス(若干)

gradle2.4以来、gradleのRule Based Model configurationに魅力を感じて、いろいろ試しています。

mike-neck.hatenadiary.com

日本人、破壊的な変更が入らない限り勉強しないので、今のところrule based model configurationを追っかけている人って僕の観察範囲では僕しかいません。しかし、この機能はGradle3.0の基本部分になってくるので、ぜひとも抑えてもらいたいものです。


ベタープラクティス(小出しというか、これしか今のところない…(´・ω・`))

幾つか作ってみた感触ですが、実装時のベタープラクティスとして、

@Managedモデルオブジェクトのvalidationは@Mutateフェーズではなく、@Mutateフェーズで生成するtaskのactionで実行するほうがよい

まあ、ベタープラクティスといってもこれだけです。

というのはtasks.create(TASK_NAME) {} の前の段階でvalidationして、不適切な値の場合に例外を投げるような作りにしておくと、gradleプロジェクトスクリプトコンパイル時に必ずビルドがコケます。特にプラグインを適用して、まだmodelの値を設定していない場合などでvalidationエラーが発生する場合は、どのタスクを実行してもBUILD FAILEDになります。したがって、validationに関してはなるべく遅延して実行されることが望ましいです。

よくない作り
@Mutate
static void createTask(ModelMap<Task> tasks, ModelObject model) {
    if (validate(model) == false) {
        throw new IllegalArgumentException("model is not well defined");
    }
    tasks.create(TASK_NAME) {
        // some configuration
    }
}

上記のような実装はgradle modelタスクを実行した時にmodelの設定をしていない場合にBUILD FAILEDになります。

ベターな作り方
@Mutate
static void createTask(ModelMap<Task> tasks, ModelObject model) {
    tasks.create(TASK_NAME) {
        // some configuration
        doLast {
            if (validate(model) == false) {
                throw new IllegalArgumentException("model is not well defined");
            }
            // some task action
        }
    }
}

これなら、ModelObjectに対するvalidationが遅延して実行されるので、他のタスクへの影響はありません。


おわり

gradle徹底入門