【问题标题】:Logic in gradle/groovy scriptinggradle/groovy 脚本中的逻辑
【发布时间】:2018-11-18 10:44:52
【问题描述】:

我是 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
        }
    }
}

jar {
    manifest {
        attributes 'Implementation-Version': '1.0' // 2. Add manifest attribute
    }
}

你可以在任何地方找到这个解决方案,但没有明确的解释。

现在,可以通过以下方式申请插件:Plugin.apply(T) 我假设 Plugin 是对象实例, apply 是它的方法, T 是一个参数。 那么apply plugin "java"是什么?

还有一种叫做 sourceSets 的东西。它可能是采用闭包参数的方法,也可能是由于 groovy 生成的默认 getter 而采用闭包作为参数的属性。 我不知道,因为在 groovy 中等号是可选的,括号是可选的。--- 非常创新!!!!!!!!!

最后还有一个叫做main的东西。我找不到它是什么,我一直在到处寻找它,甚至在这里:https://docs.gradle.org/current/dsl/org.gradle.api.tasks.SourceSet.html

这个'main'-ting包含一个叫做java的东西(看起来像SourceDirectorySet的实例),它包含方法srcDir,它接受一个字符串作为参数。

这对你有意义吗? 如何从这里提取信息: https://docs.gradle.org/current/dsl/,并在构建中使用它?

我在这里错过了什么?

【问题讨论】:

    标签: gradle groovy


    【解决方案1】:

    我在手机上,所以很难解释 Gradle 的所有魔力,但这应该对您有所帮助。

    在作用域中有一个隐含的 Project 实例,你在 gradle 脚本中看到的大部分内容都将委托给它。

    例如

    apply plugin: 'java' 
    

    相当于

    getProject().apply([plugin: 'java'])
    

    您可以在writing a custom plugin section 中阅读更多内容,但有一个属性文件将“java”映射到JavaPlugin

    当您应用“java”插件时,这会将JavaPluginConvention“混合”到项目中(因此您现在可以在java中调用getSourceSets(),在groovy中可以缩写为“sourceSets”)

    在 Gradle 的 DSL 中得到大量使用的一个特性是 Groovy 的 methodMissing(...)。所以

    sourceSets.main { ... } 
    

    实际上会被动态委托给

    sourceSets.getByName('main').configure { ... } 
    

    另一个“神奇”来源的特性是在 groovy 中你可以编写

    def a = new A()
    a.foo = 'bar'
    a.baz('x')
    

    作为

    def a = new A()
    a.with {
        foo = 'bar'
        baz('x')
    } 
    

    希望您可以看到闭包中的所有属性/方法引用都委托给“a”实例。这种配置风格有助于 gradle 脚本保持简洁。

    the with method

    【讨论】:

    • 我是一个讨厌他所谓的魔法的人,因为它迫使我记住大量的噱头,我必须考虑并在谷歌上搜索解释。我无法在合理的时间内发现: sourceSets.main { ... } 与 : sourceSets.getByName('main').configure { ... } 相同。那么,您认为 Kotlin/Gradle 对我来说会更好吗?
    • 这是一个权衡,我也是一个讨厌魔法的人,但是为了可读性,我认为这是值得的。通常,您阅读 gradle 脚本的频率远高于编写它们的频率。一旦你提到讨厌魔法,我就准备推荐 Kotlin,因为魔法是可追踪的,并且可以在 intellij 中使用代码完成输入。我自己没有尝试过 Kotlin dsl,因为我认为它有点笨重,而且不如 groovy 的同类产品漂亮。 Kotlin 脚本看起来更像代码,而不是 groovy 脚本。你愿意用可读性换取类型安全吗?
    • 我认为值得与 Maven 进行比较,因为 Maven 是 xml,这一切都很神奇。如果您在堆栈溢出时找不到 maven 示例,您通常会被卡住。使用 gradle,我可以使用 javadocs 来做几乎任何事情(假设您知道“神奇”位),而无需从堆栈溢出中复制/粘贴(假设之前有人遇到过完全相同的问题)
    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 2013-06-25
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多