Gradle:无法在插件中将参数传递给class

时间:2017-09-23 16:04:11

标签: android gradle android-gradle build.gradle

我按照example进行了尝试,并将其简化为“消息”。

UIImageView

当我运行contentMode时,我得到了

clipToBounds

我希望它是

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

为什么问候语中的字符串无法传入?

2 个答案:

答案 0 :(得分: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
            }
        }
    }
}

然而它并没有多大意义 - 所以不要使用它;)

答案 1 :(得分:0)

我设法通过直接从project.greeting.message

获取问题来解决我的问题
@TaskAction
def testCoverageVerification() {
    message = project.greeting.message
    logger.quiet("Message is")
    logger.quiet(message)
}