Gradle 生态系统分析

本文深入探讨Gradle的Convention和Extension概念,揭示它们如何增强Gradle系统的灵活性。通过分析Gradle源码,了解Convention如何作为Extension的一部分,使得自定义Plugin能够遵循约定并扩展Gradle的功能。文中通过JavaBasePlugin的示例展示了Plugin如何利用Convention添加Extensions,并解释了Convention对象(如POJO和POGO)的作用。此外,还讨论了Plugin应用后的扩展机制,包括方法查找流程和Configure Extension Method的工作原理。
摘要由CSDN通过智能技术生成

Gradle 进阶 第三篇

破山中贼易,破心中贼难

Gradle Convention and Extension

接着上文所说的 DynamicSystem,这一节会进而引入 Convention and Extension 的概念,继续扩展整个系统的灵活性,在 Gradle 的 api 官网里有直接介绍 Extension 相关的 https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtensionAware.html,
但是没有讲解关于 Convention 相关的。
Convention 的字面意思是指约定,而 Extension 的字面意思是扩展,从 Gradle 源码来看,Gradle 把这两者变成了一个有机的结合。节选 DefaultProject 类里的一段源码:

    @Override
    public ExtensionContainerInternal getExtensions() {
        return (ExtensionContainerInternal) getConvention();
    }

可以看到其实外部 get 到的 Extension 其实就是 Convention,我对于这段代码的理解是:只要对内满足一定的约定,可以被 Gradle 系统识别的一些 code,其实就是对整个系统的一种扩展。
这个是怎么用的呢,我在这里节选一段 JavaBasePlugin 的代码一作试例:

 private JavaPluginConvention addExtensions(final ProjectInternal project) {
        ...
        project.getConvention().getPlugins().put("java", javaConvention);
        project.getExtensions().create(JavaPluginExtension.class, "java", DefaultJavaPluginExtension.class, javaConvention, project, jvmPluginServices, toolchainSpec);
        project.getExtensions().add(JavaInstallationRegistry.class, "javaInstalls", javaInstallationRegistry);
        project.getExtensions().create(JavaToolchainService.class, "javaToolchains", DefaultJavaToolchainService.class, getJavaToolchainQueryService());
        return javaConvention;
    }

我们看到 JavaBasePlugin 通过添加了一些 Extensions 扩展了 Gradle。或者说对于 Gradle apply 的 Plugin,其实 Gradle 并没有完全定义这些 Plugin 的一些配置行为,但是 Convention 可以完成对于自定义 Plugin 的进行配置,是 Plugin 可以正常工作的基石。

在继续介绍之前我先把先关的两个接口展示一下:

/**
 * Allows adding 'namespaced' DSL extensions to a target object.
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值