将参数传递给自定义任务的可靠任务
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 的任务 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'
}
有任务可以用这样的参数执行:
./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 的任务 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'
}