gradle - 将参数传递给自定义任务的可靠任务
问题描述
有可以使用如下参数执行的任务:
./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 中,每个任务只会在一次调用(通常称为构建)中执行一次。现在想象一个任务需要在两个彼此无关的任务之前运行。一个很好的真实示例是任务和任务都依赖compileJava
的Java 插件中的任务。如果支持参数,则可能会发生两个任务依赖于具有不同参数的单个任务。在这种情况下应该使用哪些参数?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>'
}
}
您可以尝试定义以下任务,然后使用./gradlew customTest
task customTest {
doFirst {
android.defaultConfig.testInstrumentationRunnerArgument 'annotation', '<some-value>'
}
finalizedBy 'connectedAndroidTest'
}
推荐阅读
- c++ - 将矢量从相对坐标系转换为绝对坐标系
- excel - VBA 在过滤后的数据上创建图表
- xaml - Xamarin 在 StackLayout 内形成标签超出视图
- node.js - 有没有办法从客户端断开节点连接?
- python - 在 PyQt 中使用计时器更新标签
- javascript - 使用 JavaScript 合并表行
- firebase - 在颤振中验证电子邮件时不会调用 onAuthStateChanged
- python - 如何获取字典列表中所有人的名字?
- express - 从 ios 和 android 中的 react-native 应用程序获取响应中的不同 Set-Cookie 标头
- python - Py_Initialize 抛出 ModuleNotFoundError: No module named 'encodings'