xan*_*ani 5 properties gradle lazy-initialization kotlin gradle-task
使用扩展属性配置 Exec-Task 时遇到问题。
我的 Exec-Task 的配置依赖于扩展中定义的 String-Property。不幸的是,在配置 Exec-Task 时,该属性尚未设置。这导致TaskCreationException
:
Could not create task ':myTask'.
org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':myTask'.
...
Caused by: org.gradle.api.internal.provider.MissingValueException: Cannot query the value of extension 'myConfig' property 'command' because it has no value available.
at org.gradle.api.internal.provider.AbstractMinimalProvider.get(AbstractMinimalProvider.java:86)
Run Code Online (Sandbox Code Playgroud)
Could not create task ':myTask'.
org.gradle.api.internal.tasks.DefaultTaskContainer$TaskCreationException: Could not create task ':myTask'.
...
Caused by: org.gradle.api.internal.provider.MissingValueException: Cannot query the value of extension 'myConfig' property 'command' because it has no value available.
at org.gradle.api.internal.provider.AbstractMinimalProvider.get(AbstractMinimalProvider.java:86)
Run Code Online (Sandbox Code Playgroud)
问题似乎在于myConfig.command.get()
它规避了惰性评估。
abstract class ConfigExtension() {
abstract val command: Property<String>
}
class MyGradlePlugin : Plugin<Project> {
override fun apply(project: Project) {
val myConfig = project.extensions.create(
"myConfig",
ConfigExtension::class.java
)
val myTask = project.tasks.register(
"myTask",
Exec::class.java
) {
it.commandLine(myConfig.command.get())
}
}
}
Run Code Online (Sandbox Code Playgroud)
有jvmArgumentProviders
中JavaExec
和argumentProviders
中Exec
.
人们可以像这样使用它们:
jvmArgumentProviders.add { listOf("-Dfoo.bar=${lazyFooBar()}") }
Run Code Online (Sandbox Code Playgroud)
还有另一个技巧:使用 来延迟计算参数toString()
。因此,您可以使用惰性计算方法将对象添加到 args 列表中,toString()
以获取所需的值。
归档时间: |
|
查看次数: |
559 次 |
最近记录: |