如何在 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}")
此自定义插件存在于 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}")