Gradle 惰性执行任务配置

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)

问题

有没有一种方法commandLine可以像配置 gradle 任务一样以惰性方式配置 -Value ?[1] [2]

gua*_*uai 0

jvmArgumentProvidersJavaExecargumentProvidersExec.
人们可以像这样使用它们:

jvmArgumentProviders.add { listOf("-Dfoo.bar=${lazyFooBar()}") }
Run Code Online (Sandbox Code Playgroud)

还有另一个技巧:使用 来延迟计算参数toString()。因此,您可以使用惰性计算方法将对象添加到 args 列表中,toString()以获取所需的值。