2017-09-23 6 views
1

exampleで試してみましたが、それを単に "メッセージ"に単純化しました。私は./gradlew -q helloを実行すると、私は挨拶から私の文字列を渡すに失敗したのはなぜそれがGradle:プラグインでクラスに引数を渡すことができません

Message is 
value: Hi from Gradle 

ことを期待し

Message is 
value: null 

class GreetingPlugin implements Plugin<Project> { 
    void apply(Project project) { 
     def extension = project.extensions.create('greeting', GreetingPluginExtension, project) 
     project.tasks.create('hello', Greeting) { 
      message = extension.message 
     } 
    } 
} 

class GreetingPluginExtension { 
    def String message = "aa" 

    GreetingPluginExtension(Project project) { 
     message = project.property(String) 
    } 

} 

class Greeting extends DefaultTask { 
    @Input 
    def String message = project.property(String) 

    @TaskAction 
    def testCoverageVerification() { 
     logger.quiet("Message is") 
     logger.quiet(message) 
    } 
} 

apply plugin: GreetingPlugin 

greeting { 
    message = 'Hi from Gradle' 
} 

得ましたか。

答えて

1

実際、説明するのは簡単です。拡張子ブロックが評価される前に、の前にプラグイン(したがって、タスク作成と変数値の割り当て)が適用され、評価されます。そのため、拡張機能の値が設定される前でもタスクが作成されます。リンクからは提供:

ビルドスクリプトで拡張宣言だけでなく、拡張プロパティとカスタムタスクのプロパティの間のマッピング は、ビルドのライフサイクルの のGradleの設定段階で発生します。 評価順序の問題を回避するには、マップされたプロパティの実際の値は、実行段階で解決される でなければなりません。

それはあなたがこれまでプラグインの宣言を変更することができます動作させるために:

class GreetingPlugin implements Plugin<Project> { 
    void apply(Project project) { 
     def extension = project.extensions.create('greeting', GreetingPluginExtension, project) 
     project.tasks.create('hello', Greeting) { 
      doFirst { 
       message = extension.message 
      } 
     } 
    } 
} 

それはあまり意味がありません。しかし - それを使用しないでください。)

0

私はに管理します直接問題を解決して問題を解決してください。project.greeting.message

@TaskAction 
def testCoverageVerification() { 
    message = project.greeting.message 
    logger.quiet("Message is") 
    logger.quiet(message) 
} 
関連する問題