使用扩展属性配置执行任务时遇到问题。
问题
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)
示例
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())
}
}
}
问题似乎是myConfig.command.get()
,它规避了懒惰的评估。
测试
@Test fun `plugin registers task`() {
// Create a test project and apply the plugin
val project = ProjectBuilder.builder().build()
project.plugins.apply("com.example.plugin")
// Verify the result
assertNotNull(project.tasks.findByName("myTask"))
}
提问
是否有一种方法可以像配置gradle任务一样以懒惰的方式配置commandLine
-Value?1(https://docs.gradle.org/current/userguide/lazy_configuration.html) 2(https://docs.gradle.org/current/userguide/task_configuration_avoidance.html)
2条答案
按热度按时间j0pj023g1#
JavaExec
中有jvmArgumentProviders
,Exec
中有argumentProviders
。可以这样使用它们:
还有一招:参数使用
toString()
进行延迟计算。因此,您可以使用toString()
方法将对象添加到args列表中,并惰性地计算所需的值。jutyujz02#
Exec
任务的属性,如executable
、args
或commandLine
(设置前两个),尚未接受Provider
s。但是在需要时,这些值会使用
toString()
进行延迟计算。因此,为了更加懒惰,您可以提供一些对象,在其toString()
方法中懒惰地计算扩展的属性。但实际上,这不会改变你的情况。您可以适当地利用任务配置避免。
因此,只有在配置
Exec
任务时才会计算扩展属性。因此,只要构建中没有其他内容破坏该任务的任务配置避免,就应该没问题。
问题出在您的测试上,它没有配置扩展,但随后导致任务通过使用
findByName
实现和配置。您可能应该为扩展属性定义一些约定,这样它就不会被取消设置,或者在查询任务之前在测试中设置一个值。