有些任务可以用这样的参数执行:
./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
?
答案 0 :(得分:1)
简单的答案:您不能。任务依赖项仅表示需要的事,而不是需要的事
让我向您展示一个简单的示例,为什么在Gradle任务系统中无法进行这样的操作:
首先,我们需要知道,在Gradle中,每个任务仅在一次调用(通常称为build)中仅一次执行。现在想象一个需要在彼此不相关的两个任务之前运行的任务。一个真实的好例子是Java plugin中的任务compileJava
,test
任务和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'
}