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

Gradle 将参数传递给自定义任务的可靠任务,gradle,plugins,Gradle,Plugins,有一个任务可以使用如下参数执行: /gradlew taskX-Pkey=value 和带有自定义任务的插件,该任务应执行taskX: class CustomPlugin:Plugin{ 覆盖应用(项目:项目){ project.tasks.register(“自定义”,CustomTask::class.java) .配置{ it.description=“description” it.group=“集团” val taskX=project.getTasksByName(“taskX”

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

/gradlew taskX-Pkey=value
和带有自定义任务的插件,该任务应执行
taskX

class CustomPlugin:Plugin{
覆盖应用(项目:项目){
project.tasks.register(“自定义”,CustomTask::class.java)
.配置{
it.description=“description”
it.group=“集团”
val taskX=project.getTasksByName(“taskX”,true).first()
it.dependsOn(taskX)
}
}
}
我希望有类似的情况,例如:

it.dependsOn(taskX,“key=value”)

如何将参数传递给
dependsOn

简单回答:你不能。任务依赖关系只表达需要事先做什么,而不是如何做


让我向您展示一个简单的示例,为什么在Gradle任务系统中这样的事情是不可能的:

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

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

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>'
    }
}

谢谢你的解释。但是我仍然想知道如何在
doFirst
中设置
-P
。据我所知,这类参数是分配给项目的,但是
project.setProperty
实际上没有任何作用。项目属性(通过
-P
传递的属性)只是将参数或配置排除在构建脚本之外的一种方法。但是,因为您希望在插件中应用配置,所以根本不需要使用项目属性。在您的示例中,任务的类型是什么?它是
connectedAndroidTest
。属性是android.TestInstrumentationRunneArguments.annotation,它设置运行程序应使用的注释来运行特定测试并忽略其他测试。这意味着我需要在
project.configurations
中找到正确的配置并设置此属性?我编辑了我的答案,重点是您的任务和属性。谢谢。还发现了如何使用Kotlin。不幸的是,由于某种原因,设置
testinstrumentationrunneargument
没有任何区别。看起来,
android
extension在某种程度上更早地使用了这个属性。我会问另一个问题。
task customTest {
    doFirst {
        android.defaultConfig.testInstrumentationRunnerArgument 'annotation', '<some-value>'
    }
    finalizedBy 'connectedAndroidTest'
}