2017-09-23 99 views
1

我嘗試按照example,並將其簡化爲「message」。Gradle:無法將參數傳遞給插件中的類

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

當我運行./gradlew -q hello,我

Message is 
value: null 

我希望它是

Message is 
value: Hi from Gradle 

爲什麼從問候我的字符串無法在通過?

回答

1

實際上,這很容易解釋。插件(因此任務創建和變量值分配)應用和評估之前評估擴展塊。所以甚至在擴展的值被設置之前創建任務。從鏈接您提供:

在構建腳本擴展聲明以及擴展性和自定義任務屬性之間的映射 期間 搖籃的構建生命週期的配置階段發生。爲避免 評估訂單問題,必須在執行階段解決映射屬性的實際值 。

爲了使它工作,你可以改變插件聲明如下:

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