将参数传递给自定义任务的可靠任务

Passing parameters to dependable task of custom task

有任务可以用这样的参数执行:

./gradlew taskX -Pkey=value

以及带有应执行的自定义任务的插件 taskX:

class CustomPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.tasks.register("custom", CustomTask::class.java)
            .configure {
                it.description = "Description"
                it.group = "Group"

                val taskX = project.getTasksByName("taskX", true).first()

                it.dependsOn(taskX)
            }
    }
}

例如,我希望得到这样的结果:

it.dependsOn(taskX, "key=value")

如何给dependsOn传递参数?

简单的回答:你不能。任务依赖只表达什么需要事先完成,不是如何需要完成。


让我给你看一个简单的例子,为什么这样的事情在 Gradle 任务系统中是不可能的:

首先,我们需要知道在Gradle中,每个任务只会在一次调用(通常称为构建)中执行一次。现在想象一个任务需要 运行 在两个互不相关的任务之前。一个很好的真实世界示例是来自 Java plugin 的任务 compileJavatest 任务和 jar 任务都依赖于它。如果 dependsOn 支持参数,则可能会出现两个任务依赖于具有不同参数的单个任务的情况。在这种情况下应该使用什么参数?

作为解决方案,您可以直接在插件中配置其他任务。如果您只想在自定义任务为 运行 时传递参数,您可能需要添加另一个任务 运行 作为设置并将所需的配置应用于实际任务:

task setup {
    doFirst {
        // apply configuration
    }
}

taskX.mustRunAfter setup

task custom {
    dependsOn setup
    dependsOn taskX
}

此示例使用 Groovy,但应该可以将其翻译成 Kotlin 并在您的插件中使用它。


编辑实参

老实说,我对Android Gradle 插件不是很熟悉,但是如果this documentation 对了,项目属性 android.testInstrumentationRunnerArguments.annotation 只是在构建脚本中使用以下代码的替代方法:

android {
    defaultConfig {
        testInstrumentationRunnerArgument 'annotation', '<some-value>'
    }
}

您可以尝试定义以下任务,然后 运行 使用 ./gradlew customTest

task customTest {
    doFirst {
        android.defaultConfig.testInstrumentationRunnerArgument 'annotation', '<some-value>'
    }
    finalizedBy 'connectedAndroidTest'
}