如何在 buildSrc 的任务中传递 @Input String

How to pass @Input String in a task in buildSrc

此自定义插件存在于 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 的 incubating build-cache functionality.

,直接从任务内部使用 project.buildDir 不是可接受的答案

首先,class 类型问题在 Gradle 中不可见。

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

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

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

// instead of:
inputs.property("buildDir", "${project.buildDir}")
// just this:
buildDir.set("${project.buildDir}")