A standalone plugin project

news/2024/5/20 5:02:01 标签: gradle, java, android, standalone, plugin

standalone_plugin_project_0">A standalone plugin project

我们将插件移至独立项目,以便我们可以发布它并与他人共享。 这个项目只是一个Groovy项目,它产生一个包含插件类的JAR。 这是该项目的简单构建脚本。 它应用了Groovy插件,并将Gradle API添加为编译时依赖项。

自定义插件的构建:

apply plugin: 'groovy'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

那么Gradle如何找到插件实现? 答案是您需要在jar的 **META-INF/gradle-plugins**
目录中提供与插件ID相匹配的属性文件。

plugin_17">Wiring for a custom plugin:

**src/main/resources/META-INF/gradle-plugins/com.lkl.standaloneplugin.custom-plugin.properties**

implementation-class=implementation-class=com.lkl.standaloneplugin.CustomPlugin

请注意,属性文件名与插件ID匹配,并放置在资源文件夹中,并且实现类属性标识插件实现类。该目录下可以放置多个文件,同时实现多个plugin

plugin_id_24">Creating a plugin id

插件ID以类似于Java软件包的方式(即反向域名)。 这有助于避免冲突,并提供了一种将具有相似所有权的插件分组的方法。

您的插件ID应该是反映命名空间(合理指向您或您的组织)的组件及其提供的插件名称的组合。例如,如果您有一个名为“ lkl22”的Github帐户,而您的插件名为“bar”,则合适的插件ID可能是com.github.lkl22.bar。同样,如果插件是由baz组织开发的,则插件ID可能是org.baz.bar

插件ID应符合以下条件:

  • 可以包含任何字母数字字符“.”“-”
  • 必须至少包含一个“.”, 分隔命名空间和插件名称的字符
  • 按照惯例,对命名空间使用小写的反向域名约定
  • 通常,名称中仅使用小写字符
  • 不能使用org.gradlecom.gradleware命名空间
  • 不能以“.”字符开头或结尾
  • 不能包含连续的“.” 字符(即“..”

尽管插件ID与程序包名称之间存在常规的相似之处,但通常包名称比插件ID所需的名称更为详细。
例如,在您的插件ID中添加“gradle”作为组件似乎很合理,但是由于插件ID仅用于Gradle插件,因此这是多余的。

通常,一个良好的插件ID仅需要一个用于标识所有权和名称的命名空间。

plugin_43">Publishing your plugin

如果要在内部发布插件供组织内部使用,则可以像其他任何代码工件一样发布。

如果您有兴趣发布您的插件以供更广泛的Gradle社区使用,则可以将其发布到Gradle插件门户。该站点提供了搜索和收集有关Gradle社区贡献的插件的信息的功能。请参阅相应的指南,以了解如何在此站点上使用您的插件。

plugin_in_another_project_49">Using your plugin in another project

要在构建脚本中使用插件,您需要将插件类添加到构建脚本的类路径中。 为此,请使用“buildscript{}”块,请参见使用buildscript块应用插件中所述。
以下示例显示了包含插件的JAR已发布到本地存储库时如何执行此操作:

buildscript {
    repositories {
        maven {
            url = uri(repoLocation)
        }
    }
    dependencies {
        classpath 'org.gradle:customPlugin:1.0-SNAPSHOT'
    }
}

apply plugin: 'org.samples.greeting'

plugin_69">Writing tests for your plugin

您可以使用ProjectBuilder类创建在测试插件实现时要使用的Project实例。

Testing a custom plugin:

src/test/java/com/lkl/standaloneplugin/ExampleUnitTest.java

java">public class ExampleUnitTest {
    @Test
    public void customPluginTest() {
        Project project = ProjectBuilder.builder().build();
        project.getPluginManager().apply("com.lkl.standaloneplugin.custom-plugin");

        System.out.println(project.getDisplayName());
        assertEquals("root project 'test'", project.getDisplayName());
    }
}

开发调试技巧

建一个buildSrc plugin默认开发模块,在buildSrc模块的build.gradle里指定源码路径为该模块的源码位置。从而达到直接调试standaloneplugin源码的目的。

if (isDebugCustomPlugin) {
    java.srcDirs += "${project.rootDir.parent}/standaloneplugin/src/main/java"
    resources.srcDirs += "${project.rootDir.parent}/standaloneplugin/src/main/resources"
    println "引用CustomPlugin模块源码"
}

plugin开发调试代码,可以参考:开发groovy plugin、编译时注解时调试技巧,有一点需要注意的是第二步选择编译task的时候可以灵活的选择,可以根据我们plugin作用于编译时的哪个阶段来选择task,如果不清楚的话,可以直接选择全量最大化的编译task,比如:assemble task

参考文献

Developing Custom Gradle Plugins


http://www.niftyadmin.cn/n/1268701.html

相关文章

Leetcode 28:实现strStr()(超详细的解法!!!)

实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack "hello", needle "ll" 输出: 2示例…

自定义Transform

自定义Transform 本文章研究所使用的示例代码:AndroidPluginDemo 基础概念 术语说明TransformInput所谓Transform就是对输入的class文件转变成目标字节码文件,TransformInput就是这些输入文件的抽象。目前它包括两部分:DirectoryInput集合…

Leetcode 29:两数相除(超详细的解法!!!)

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend 10, divisor 3 输出: 3示例 2: 输入: dividend 7, divisor -3 输出:…

ASM 6 Developer Guide

主要数据结构 对象模型 核心程序包由28个类和接口组成。如果我们排除Opcodes接口,5个抽象访问者类(AnnotationVisitor, ClassVisitor,FieldVisitor, MethodVisitor 和 ModuleVisitor)和6实用工具类&#…

Leetcode 38:报数(超详细的解法!!!)

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 1112211 被读作 "one 1" ("一个一") , 即 11。 11 被读作 "two 1s" (…

‘buildSrc‘ cannot be used as a project name as it is a reserved name.

‘buildSrc’ cannot be used as a project name as it is a reserved name. 可以尝试使用以下方法解决: 打开你的 settings.gradle / settings.gradle.kts 文件 将 “buildSrc” 从 included modules 移除 重新编译

Leetcode 36:有效的数独(超详细的解法!!!)

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格…

groovy 替换文件指定内容

groovy 替换文件指定内容 替换指定文件的部分内容脚本 static def replaceFileText(file, oldText, newText) {String text file.text.replaceAll(oldText, newText)file.withPrintWriter { printWriter ->printWriter.print(text)} }使用范例 gradle.startParameter.ge…