如何使用 Gradle 配置功能以及它们如何工作?

Ben*_*man 6 java gradle

我试图了解 Gradle 依赖配置,在深入研究一些文档(例如,https://docs.gradle.org/current/userguide/java_library_plugin.html)后,我留下了一堆相关的问题*:

  • 在 Gradle 中,jar、工件、依赖项和模块之间有什么区别?有哪些非 jar 的工件、依赖项和模块的示例?不是模块的工件?ETC...

  • 什么是可解析配置?我发现如果配置 x.canBeResolved 那么我可以调用 x.resolve 来获取一组 jar 路径,而 x.resolve 方法不会抛出错误(这就是将配置标记为消耗品的全部内容吗?)。但不是所有的配置集都是模块,所以我不应该能够看到它们是什么吗?如果是这样,怎么办?

  • 什么是消耗品配置?将配置标记为“消耗品”允许您做什么/阻止您做什么?有哪些消耗品配置的好例子?如何利用可消耗/不可消耗的配置?

  • 配置的哪些其他属性很重要以及为什么(例如,属性是否用于除变体之外的任何内容)?

  • 什么是变体,它们是如何创建和使用的,以及为什么要创建/使用它们?(参见https://gradle.github.io/webinar-dep-mgmt-part-1/#/more-definitions)。

  • java和插件如何java-library利用配置的这些功能?特别是,api在幕后如何与配置进行不同的配置或处理implementation?这与可解析/可消耗有什么关系吗?

  • 此时我还应该问哪些其他问题?

特别感谢具体的示例和代码。

*我意识到其中许多问题都可以单独提出,如果您对某个问题有一个好的答案(或链接),请分享。然而,我试图了解全局,所以我将它们放在一个标题下。另外,我怀疑如果没有其他问题的答案,我将无法理解某些问题的答案——例如 jars、工件、依赖项、模块——并且我正在努力减少问答延迟和一般问题困惑。

aSe*_*emy 1

以下是您的一些问题的答案。

\n

在 Gradle 中,jar、工件、依赖项和模块之间有什么区别?

\n

Gradle 将这些东西称为“组件”。

\n

首先我会回答一个不同的问题:Gradle 如何区分组件?

\n

它使用称为“变体属性”的标志来实现这一点。简而言之,这些是字符串键值标志,描述诸如“Maven 坐标为org.junit.jupiter:junit-jupiter:5.8.1”和“该项目包含 Java 文件”之类的内容。

\n

属性可以是任何东西。Gradle 内置了一些标准属性,或者您也可以创建自己的.

\n

因此,要回答这个问题,jar、工件、依赖项和模块之间的区别取决于属性。

\n

什么是可解析/可消耗配置?

\n

我将在这里引用文档

\n
\n

配置至少有 3 个不同的角色:

\n
    \n
  1. 声明依赖关系

    \n
  2. \n
  3. 作为消费者,解决一组对文件的依赖关系

    \n
  4. \n
  5. 作为生产者,公开工件及其依赖项以供其他项目使用(此类消耗性配置通常代表生产者向其消费者提供的变体)

    \n
  6. \n
\n
\n

文档中还有一个表格显示了组合。这是复制品:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n
配置角色可以解决可以食用
依赖桶假\xe2\x9d\x8c假\xe2\x9d\x8c
解决特定用途真 \xe2\x9c\x85假\xe2\x9d\x8c
暴露给消费者假\xe2\x9d\x8c真 \xe2\x9c\x85
旧版,不要使用\xe2\x80\x99t真 \xe2\x9c\x85真 \xe2\x9c\x85
\n
\n

旁白:我一直发现“配置”是一个糟糕的词选择。对我来说,它更多地意味着“这是我想要应用于 Gradle 构建的设置”,而 Gradle 意味着它更像是“这是以某种方式组织的项目的集合”。

\n

什么是变体,它们是如何创建和使用的,以及为什么要创建/使用它们?

\n

变体是通过在配置上设置不同的属性来创建的。它们由请求组件的消费者使用,并且具有兼容的属性。

\n

类比:形状分类玩具

\n

这样想:您知道儿童形状分类盒玩具吗?有不同形状的木块:圆柱体、三角形、立方体、星形。还有一个带有类似形状孔的盒子。

\n
模块
\n

这些块就是 Gradle 所说的模块。它们是 Gradle 项目请求或生成的依赖项。

\n
属性
\n

这些块有描述它们的名称。正方形、矩形、圆形……这些都是 Gradle 属性。名称“正方形”可以描述该块,也可以描述该块切入的盒子中相应的孔。

\n
变体
\n

有时形状彼此非常相似。也许一个矩形孔比另一个矩形孔稍高。这些都是变种。(这个类比在这个问题上有点不成立 - 但我希望你明白原则:“矩形”的属性仍然适用,但有一点发生了变化,使它成为一个变体矩形。)

\n

有时方块有不同的颜色,但洞并不关心方块是红色、黄色还是蓝色。因此,可能存在消费者或生产者不关心的差异变体。

\n
配置
\n

该盒子是“消耗品”配置。它消耗块,但消耗属性与盒子中孔的属性相匹配的块。我们可以查看盒子内部,找到所有匹配某些属性的模块。

\n

“可解析”配置是孩子们玩耍、执行动作尝试找到匹配的块。他们只能使用他们可以看到的块,但他们的计划不是继续保留这些块,而是将它们提供给消耗的盒子。

\n

如果我们愿意,我们可以指导孩子“只寻找圆形块”。这就是我们将“属性”应用到孩子身上。因此,即使盒子可以接受的不仅仅是圆形块,它也只能得到圆形块,因为这就是孩子被指示要做的所有事情。

\n

一个例子

\n

Gradle 网站上有一个创建消费/生产配置的示例,但在 7.4 版本中被删除,因为有一个新的 JaCoCo 聚合插件。我认为这有点遗憾,因为该示例仍然与使用变体感知配置的项目之间共享输出相关。

\n

幸运的是,它仍然可以直接使用,所以这里是链接:\n https://docs.gradle.org/7.3/samples/sample_jvm_multi_project_with_code_coverage.html

\n