作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很难理解 Gradle 的 Groovy DSL 是如何工作的。
不幸的是,Gradle 是我在日常工作中遇到的 Groovy 的主要用例,而且我注意到对于许多开发人员来说,他们完全通过 Gradle 接触到 Groovy。因此,大多数 Gradle 用户对 Groovy 的掌握非常有限。
在我对 Groovy 的有限理解中,以下语法 tokenA tokenB { tokenC }
其中所有标记都不是语言关键字,tokenA
将是我们使用参数调用的方法 tokenB
最后一个参数是一个闭包。我想我是正确的,但我知道我错了,因为在 tokenB 之后可能需要一个逗号才能使分析正确。
正如您已经知道的那样,我绝不是 Groovy 开发人员,而且我认为在不学习 Groovy 基础知识的情况下使用 Gradle 是一件坏事,因为它限制了我充分利用其功能。但我唯一可行的选择是通过示例学习而不不幸地学习理论。
我确实检查了一些类似的问题,例如 this one但没有对我来说足够清晰或完整的答案。
TL;DR
task myTask { doLast {} }
用 Groovy 解释? myTask
怎么样当有 task
时解释为标识符而不是 def
还是它背后的类型? myTask { dependsOn myOtherTask }
这是如何解释的? 最佳答案
我相信这一切都很时髦,没有什么特别的。这是您需要了解的常规概念。
class MyClass {
void doStuff(String name, Closure c) {
c.call()
}
}
def o = new MyClass()
o.doStuff('x') {
println "hello"
}
class MyClass {
def methodMissing(String name, args) {
println "You invoked ${name}(${args})"
}
}
def o = new MyClass() {
o.thisMethodDoesNotExist('foo')
}
class MyBean {
void include(String pattern) {...}
void exclude(String pattern) {...}
}
class MyClass {
private MyBean myBean = new MyBean()
void doStuff(Closure c) {
c.setDelegate(myBean)
c.call()
}
}
def o = new MyClass()
o.doStuff {
include 'foo'
exclude 'bar'
}
task myTask(type:Foo) {
doLast {...}
}
Closure c = {
doLast {...}
}
project.task(project.myTask([type: Foo.class], c))
project.myTask(...)
方法不存在,行为最终通过
methodMissing
实现功能。 Gradle 会将闭包上的委托(delegate)设置为任务实例。因此闭包中的任何方法都将委托(delegate)给新创建的任务。
Action<? extends Task> action = { task ->
task.doLast {...}
}
project.tasks.create('myTask', Foo.class, action)
关于Gradle 任务语法 : how is it explained from a Groovy perspective?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906489/
我是一名优秀的程序员,十分优秀!