gradle/groovy脚本中的逻辑
我是groovy gradle领域的新手,现在我正在学习多个在线课程,但我在这里遗漏了一些东西 我给你举个例子。这将创建一个Jar文件:gradle/groovy脚本中的逻辑,gradle,groovy,Gradle,Groovy,我是groovy gradle领域的新手,现在我正在学习多个在线课程,但我在这里遗漏了一些东西 我给你举个例子。这将创建一个Jar文件: apply plugin: 'java' // 1. Apply the Java plugin to the project sourceSets { main { java { srcDir 'java' // 3. Add 'java' directory as a source directory
apply plugin: 'java' // 1. Apply the Java plugin to the project
sourceSets {
main {
java {
srcDir 'java' // 3. Add 'java' directory as a source directory
}
}
}
jar {
manifest {
attributes 'Implementation-Version': '1.0' // 2. Add manifest attribute
}
}
这种解决方案随处可见,但解释不清楚
现在,可以通过以下方式应用插件:plugin.apply(T)
我假设插件是对象实例,apply是它的方法,T是一个参数。
那么什么是应用插件“java”
还有一种东西叫做源集。它可能是采用闭包参数的方法,也可能是采用闭包作为参数的属性,因为groovy生成了默认getter。
我说不出来,因为在groovy中,等号是可选的,括号是可选的。----非常创新
最后还有一个叫做main的东西。我找不到它是什么,我一直在到处寻找,甚至在这里:
这个“main”包含名为java的东西(看起来像SourceDirectorySet的实例),它包含方法srcDir,该方法将字符串作为变量
这对你有意义吗?。
如何从此处提取信息:
,并在构建中使用它
我在这里错过了什么?我在手机上,所以很难解释所有的Gradle魔法,但这应该会对你有所帮助 作用域中有一个隐式实例,您在gradle脚本中看到的大部分内容都将委托给它 乙二醇 相当于
getProject().apply([plugin: 'java'])
您可以在中阅读更多内容,但有一个属性文件将“java”映射到
当您应用“java”插件时,这将“混合”到项目中(因此您现在可以在java中调用getSourceSets(),在groovy中可以将其缩短为“sourceSets”)
Groovy的一个特性在Gradle的DSL中得到了广泛的应用。所以
实际上将动态地委托给
sourceSets.getByName('main').configure { ... }
另一个“魔力”来源的特性是,在groovy中,您可以编写
def a = new A()
a.foo = 'bar'
a.baz('x')
作为
希望您能看到闭包中的所有属性/方法引用都委托给“a”实例。这种配置风格有助于gradle脚本保持简洁
请看我是一个讨厌他所谓的魔法的人,因为它迫使我记住大量我必须考虑的伎俩,并通过谷歌搜索来解释。我无法找到:sourceset.main{…}与:sourceset.getByName('main')相同。请在合理的时间内配置{…}。那么,你认为Kotlin/Gradle对我来说会更好吗?这是一种折衷,我也是一个讨厌魔法的人,但是对于Gradle,为了可读性,我认为这是值得的。通常,您阅读gradle脚本的频率远远高于编写脚本的频率。当你提到憎恨魔法时,我已经准备好推荐Kotlin,因为魔法是可追踪的,并且在intellij中输入代码完成。我自己还没有试过Kotlin dsl,因为我觉得它有点笨重,也没有groovy的同类产品好看。Kotlin脚本看起来更像是代码,而不是groovy等效代码。你愿意用可读性来换取类型安全吗?我认为与Maven相比是值得的,Maven是xml的,而且非常神奇。如果在堆栈溢出上找不到maven示例,您通常会被卡住。有了gradle,我可以使用javadocs做几乎任何事情(假设你知道“神奇”的部分),而不需要从堆栈溢出复制/粘贴(假设有人之前也有同样的问题)
sourceSets.getByName('main').configure { ... }
def a = new A()
a.foo = 'bar'
a.baz('x')
def a = new A()
a.with {
foo = 'bar'
baz('x')
}