0

这个自定义插件存在于 gradle 中buildSrc/

abstract class MyTask : DefaultTask() {

    @get:Input
    abstract val buildDir: Property<String>

    @TaskAction
    fun someTask() {
       // do stuff
    }
}

class DevelopmentPlugin : Plugin<Project> {

    override fun apply(project: Project) {
        project.tasks.run {
            register("myTask", MyTask::class.java) {

                inputs.property("buildDir", project.buildDir)

                println(inputs.getProperties())
            }
        }
    }
}

并通过运行例如$ ./gradlew myTask失败的任务:

Could not determine the dependencies of task ':myTask'.
> Cannot query the value of task ':myTask' property 'rootDir' because it has no value available.

prinln 输出也{buildDir=null}意味着inputs.property("buildDir", project.buildDir)失败。


如何project.buildDir从任务中的插件传递值?

由于 Gradle 的孵化构建缓存功能project.buildDir,直接从任务内部使用不是一个可接受的答案。

4

1 回答 1

0

首先,有一个在 Gradle 中不可见的类类型问题。

buildDir 是类型File,而属性是String.

所以"${project.buildDir}"应该使用。

其次,由于属性 isabstract val它可以在闭包中直接访问。因此可以设置为:

// instead of:
inputs.property("buildDir", "${project.buildDir}")
// just this:
buildDir.set("${project.buildDir}")
于 2021-12-13T14:49:37.877 回答