20

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

煮詰めて、ここに問題があります。build.gradle追加のプロジェクト プロパティを設定するルート 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

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

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

1 に答える 1

35

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

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

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

于 2013-01-25T22:42:03.130 に答える