Gradle惰性Exec-Task配置

gupuwyp2  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(132)

使用扩展属性配置执行任务时遇到问题。

问题

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)

j0pj023g

j0pj023g1#

JavaExec中有jvmArgumentProvidersExec中有argumentProviders
可以这样使用它们:

jvmArgumentProviders.add { listOf("-Dfoo.bar=${lazyFooBar()}") }

还有一招:参数使用toString()进行延迟计算。因此,您可以使用toString()方法将对象添加到args列表中,并惰性地计算所需的值。

jutyujz0

jutyujz02#

Exec任务的属性,如executableargscommandLine(设置前两个),尚未接受Provider s。
但是在需要时,这些值会使用toString()进行延迟计算。因此,为了更加懒惰,您可以提供一些对象,在其toString()方法中懒惰地计算扩展的属性。
但实际上,这不会改变你的情况。您可以适当地利用任务配置避免。
因此,只有在配置Exec任务时才会计算扩展属性。
因此,只要构建中没有其他内容破坏该任务的任务配置避免,就应该没问题。
问题出在您的测试上,它没有配置扩展,但随后导致任务通过使用findByName实现和配置。
您可能应该为扩展属性定义一些约定,这样它就不会被取消设置,或者在查询任务之前在测试中设置一个值。

相关问题