2017-09-23 2 views
1

J'ai essayé selon example dans, et simplifié à juste "message".Gradle: Impossible de passer l'argument à la classe dans le plugin

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' 
} 

Quand je lance ./gradlew -q hello, je suis

Message is 
value: null 

Je pensais que ce serait

Message is 
value: Hi from Gradle 

Pourquoi ma chaîne du message d'accueil ne parviennent pas à passer?

Répondre

1

En fait, c'est assez facile à expliquer. Le plugin (d'où la création de la tâche et l'affectation de la valeur variable) est appliqué et évalué avant le bloc d'extension est évalué. La tâche est donc créée avant même que la valeur de l'extension ne soit définie. À partir du lien que vous avez fourni:

La déclaration d'extension dans le script de construction, ainsi que la mise en correspondance entre les propriétés d'extension et les propriétés des tâches personnalisées se produit au cours phase de configuration de Gradle du cycle de vie de construction. Pour éviter les problèmes d'ordre d'évaluation , la valeur réelle d'une propriété mappée doit être être résolue pendant la phase d'exécution.

Pour le faire fonctionner, vous pouvez modifier la déclaration de plug-in à ceci:

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 
      } 
     } 
    } 
} 

Cependant, il ne fait pas beaucoup de sens - donc ne l'utilisez pas;)

0

je parviens à résoudre mon problème en l'obtenant directement de project.greeting.message

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