首页 > 解决方案 > 将参数传递给自定义任务的可靠任务

问题描述

有可以使用如下参数执行的任务:

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

标签: gradleplugins

解决方案


简单的回答:你不能。任务依赖关系只表示需要事先完成的工作,而不表示需要如何完成。


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

首先,我们需要知道在 Gradle 中,每个任务只会在一次调用(通常称为构建)中执行一次。现在想象一个任务需要在两个彼此无关的任务之前运行。一个很好的真实示例是任务和任务都依赖compileJavaJava 插件中的任务。如果支持参数,则可能会发生两个任务依赖于具有不同参数的单个任务。在这种情况下应该使用哪些参数?testjardependsOn

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

task setup {
    doFirst {
        // apply configuration
    }
}

taskX.mustRunAfter setup

task custom {
    dependsOn setup
    dependsOn taskX
}

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


关于实际参数的编辑

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

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

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

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

推荐阅读