web-dev-qa-db-ja.com

サブプロジェクトで定義されたカスタムタスクに表示されない追加のプロパティをGradleします

この回答 で提案されたものと同様に、複数のGradleタスク間で共通のロジックを再利用しようとしていますが、余分なプロジェクトプロパティが表示されないという問題があります。

煮詰めて、ここに問題があります。追加のプロジェクトプロパティを設定するルートGradleビルドスクリプトbuild.gradleがあるとします。

project.ext.myProp = 'myValue'

settings.gradleで定義されたサブプロジェクトがあります。

include 'subproject'

サブプロジェクトは、その追加のプロジェクトプロパティを参照するカスタムタスクを定義して使用します。

class CustomTask extends DefaultTask {
    CustomTask() {
        doFirst {
            println project.ext.myProp
        }
    }
}

task custom(type: CustomTask) {
    println 'custom task'
}

これを実行すると、次のようになります。

FAILURE: Build failed with an exception.
...
* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating project ':subproject'.
...
Caused by: org.gradle.api.tasks.TaskInstantiationException: Could not create task of type 'CustomTask'.
...
Caused by: groovy.lang.MissingPropertyException: cannot get property 'myProp' on extra properties extension as it does not exist
...

BUILD FAILED

これは次の場合に機能するように見えることに注意してください。

  • カスタムタスクは、追加のプロパティと一緒にルートプロジェクトで定義されます
  • 追加のプロパティの代わりに動的プロパティを使用しているが、それらは非推奨である場合
18
Alan Krueger

ビルドスクリプトでfooという名前の追加プロパティを読み取るために推奨される構文は、fooまたはproject.fooext.fooではなく)です。これにより、親プロジェクトも検索されます。 (追加)プロパティ。編集:タスククラスでは、project.fooを使用できます。

追加のプロパティは、ビルドスクリプトでのアドホックスクリプトのみを対象としていることに注意してください。タスククラスとプラグインはnotそれらを使用する必要があります。タスククラスは、Gradleオブジェクトモデルに手を差し伸べるべきではありません。代わりに、ビルドスクリプトやプラグインが必要なすべての情報を提供できるようにするプロパティ(および必要に応じてメソッド)を宣言する必要があります。これにより、タスククラスの理解、再利用、および文書化が容易になり、@Input...および@Output...アノテーションを介して入力と出力を宣言できるようになります。

PS:コンストラクターでdoFirstを呼び出す代わりに、タスククラスには通常@TaskActionでアノテーションが付けられたメソッドがあります。

33