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

时间:2020-06-16 23:42:09

标签: gradle plugins

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

./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

1 个答案:

答案 0 :(得分:1)

简单的答案:您不能。任务依赖项仅表示需要的事,而不是需要的事


让我向您展示一个简单的示例,为什么在Gradle任务系统中无法进行这样的操作:

首先,我们需要知道,在Gradle中,每个任务仅在一次调用(通常称为build)中仅一次执行。现在想象一个需要在彼此不相关的两个任务之前运行的任务。一个真实的好例子是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'
}