この回答 で提案されたものと同様に、複数の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
これは次の場合に機能するように見えることに注意してください。
ビルドスクリプトでfoo
という名前の追加プロパティを読み取るために推奨される構文は、foo
またはproject.foo
(ext.foo
ではなく)です。これにより、親プロジェクトも検索されます。 (追加)プロパティ。編集:タスククラスでは、project.foo
を使用できます。
追加のプロパティは、ビルドスクリプトでのアドホックスクリプトのみを対象としていることに注意してください。タスククラスとプラグインはnotそれらを使用する必要があります。タスククラスは、Gradleオブジェクトモデルに手を差し伸べるべきではありません。代わりに、ビルドスクリプトやプラグインが必要なすべての情報を提供できるようにするプロパティ(および必要に応じてメソッド)を宣言する必要があります。これにより、タスククラスの理解、再利用、および文書化が容易になり、@Input...
および@Output...
アノテーションを介して入力と出力を宣言できるようになります。
PS:コンストラクターでdoFirst
を呼び出す代わりに、タスククラスには通常@TaskAction
でアノテーションが付けられたメソッドがあります。