美文网首页Android开发
自定义Gradle Plugin远程发布

自定义Gradle Plugin远程发布

作者: 青叶小小 | 来源:发表于2021-02-04 00:09 被阅读0次

一、前言

无论是前端、后端、还是APP端,一个项目随着功能需求的迭代、人员团队的规模扩张与流动,使得项目越来越臃肿,IDE的性能也几何下降,代码耦合严重,维护性变差,编译更加耗时等。
这时,大家就会想出代码抽象与拆分,模块化、组件化、微服务化等方向演进发展;拆解完后,就希望能以Library的方式提供给使用方而不是源码,因此,Maven / JCetner等包管理工具就出世了。

二、包管理仓库

Android项目第三方库的依赖一般有三种:

  • 本身工程中的 Module 依赖(implemention project(':xxxx'));
  • 本地 libs 依赖:放置于 "./Module/libs/" 下;
  • 远程库依赖:基于第三方中央仓库;

Android 有三个中央仓库可使用:

  • Maven
  • JCenter
  • Google

这些都是公网仓库,全球可用,但出于一些公司考虑,也会在企业内部搭建私服,如下图:

repo.png

三、基于Maven的Gradle通用发布脚本

3.1、Maven基本知识

我们先来看看一个包的pom文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.chris.aop</groupId>
    <artifactId>aop-asm-gradle-plugin</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm</artifactId>
            <version>9.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.ow2.asm</groupId>
            <artifactId>asm-commons</artifactId>
            <version>9.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.android.tools.build</groupId>
            <artifactId>gradle</artifactId>
            <version>3.5.0</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    
    <name>com.chris.aop:aop-asm-gradle-plugin</name>
    <url>https://github.com/qingye/AndroidAOPDemo</url>
    <description>android aop</description>

    <licenses>
        <license>
            <name>The Apache Software License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
        </license>
    </licenses>

    <developers>
        <developer>
            <name>qingye</name>
        </developer>
    </developers>
    
    <scm>
        <url>https://github.com/qingye/AndroidAOPDemo</url>
    </scm>
</project>

POM文件其实就是一个XML文件,最核心也是最基本的内容需要包含:

  • project标签,以及指定的协议:xmlns 和 xsi;
  • xml文档版本;
  • groupId、artifactId、version:这三者才能绝对定位一个包
    • 一个 groupId 可以有多个 artifactId;
    • 一个 artifactId 可以有多个版本;
  • dependencies:该发布包所需要的依赖信息;
  • licenses:使用方使用该包需满足的法律协议;
  • developers:开发者信息;
  • scm:源码仓库地址;

还可以有其它额外信息,但以上信息是发布一个包必需包含的信息。

3.2、maven-publish 插件

该插件能够帮助我们对 Module 进行打包,生成 POM 文件,并发布到本地指定的目录下,我们先来看看,使用了该插件后,会在Gradle面板中出现以下几条选项:

gradle-mvn.png

在 Gradle 的 Tasks 中,有个 publishing 的 Task,下面有许多可供我们打包发布,或生成 Metadata / Pom 的文件。

3.3、通用 Maven 脚本 For Java

3.3.1、定义 POM 通用配置文件

// 在项目根目录/gradle目录下新建:
// project-mvn-config.gradle 文件,内容如下:
ext {
    GROUP = 'com.chris.aop'
    VERSION_NAME = "${VERSION}"

    PROJECT_URL = 'https://github.com/qingye/AndroidAOPDemo'
    ISSUES_URL = "${PROJECT_URL}/issues"

    BINTRAY_LICENCE = ['Apache-2.0']
    BINTRAY_ORGANIZATION = "qingye"

    LICENSE = [
            NAME: "The Apache Software License, Version 2.0",
            URL : "http://www.apache.org/licenses/LICENSE-2.0.txt"
    ]

    DEVELOPER = [
            ID   : "",
            NAME : "qingye",
            EMAIL: "24854015@qq.com"
    ]

    SCM = [
            URL   : "${PROJECT_URL}",
            COMMIT: ""
    ]
}

3.3.2、其它全局配置(根目录下的 gradle.properties)

  • 修改 gradle 运行时,JVM的内存配置
  • 所有发布模块统一版本号
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

VERSION=1.0.0

3.3.3、在全局 build.gradle 中引用配置文件(全局生效)

all.png

3.3.4、通用 java 库的 Maven 脚本

// 在项目根目录/gradle目录下新建:
// publish-java.gradle 文件,内容如下:
apply plugin: 'maven-publish'

// 定义 pom 所需要的内容
def pomConfig = {
    licenses {
        license {
            name "${rootProject.ext.LICENSE.NAME}"
            url "${rootProject.ext.LICENSE.URL}"
        }
    }

    developers {
        developer {
            name "${rootProject.ext.DEVELOPER.NAME}"
        }
    }

    scm {
        url "${rootProject.ext.SCM.URL}"
    }
}

// 生成 java 文档和源码包
task javadocJar(type: Jar, dependsOn: javadoc) {
    archiveClassifier = 'javadoc'
    from javadoc.destinationDir
}
task sourcesJar(type: Jar) {
    archiveClassifier = 'sources'
    from sourceSets.main.java.srcDirs
}

// Maven 的 task
// 运行 publishing 命令时,maven插件会寻找该任务
publishing {
    publications {
        // 自定义一个 publication,名字叫 component,类型是 MavenPublication
        // 会在 build/publications 下生成该名字的 pom-default.xml文件
        component(MavenPublication) {
            // 由 Java 插件提供的标准发布构件,是包含了运行时依赖的 jar 文件
            from components.java

            groupId = group
            artifactId = POM_ARTIFACT_ID
            version = version

            artifact sourcesJar
            artifact javadocJar

            // append additional configurations
            pom.withXml {
                def root = asNode()
                root.appendNode('name', "${group}:${POM_ARTIFACT_ID}")
                root.appendNode('url', "${rootProject.ext.PROJECT_URL}")
                root.appendNode('description', 'android aop')
                root.children().last() + pomConfig
            }
        }
    }

    // 定义 maven 仓库名称
    // 1. 可以在这里定义一个 repositories
    // 2. 可以在后面追加
}

// 指定发布仓库的本地路径(该路径为项目根目录下的 repo 目录)
publishing.repositories {
    maven {
        url "../repo"
    }
}

3.3.5、模块引用与使用

  • 在需要发布的 Java 模块下,新建一个适用于该模块的 gradle.properties 文件,内容如下:
POM_ARTIFACT_ID=aop-asm-gradle-plugin
POM_NAME=Android AOP ASM Gradle Plugin
POM_PACKAGING=jar
  • 修改模块的 build.gradle
// 其它插件、所需依赖等信息
......

// 使用全局统一的 groupId 和 version
// artifactId 为模块下 gradle.properties 中定义的
group = "${rootProject.ext.GROUP}"
version = "${rootProject.ext.VERSION_NAME}"

/****************************************************************************
 * Use command-line to build single module (at root project):
 *
 * $ ./gradlew :aop-asm-gradle-plugin:publish
 ****************************************************************************/
apply from: rootProject.file('gradle/publish-java.gradle')

3.3.6、打包发布

在 Android Studio 的 Terminal 面板中,输入上面的单个模块发布命令,如下图:

build.png

生成了我们需要的 jar 包。

四、公网仓库发布(JCenter)

如果无法翻墙,那这部分看看就行!

对于 Android 开发者,大家再熟悉不过了,就不用多介绍了,今天主要教大家如何注册和使用该仓库。

4.1、注册账号与仓库

bintray.png
  • (Sign Up)注册账号(如果大家有Github,就直接用Github账号)
signup.png
  • 点击 Sign up with Github(会要求你先登录 Github 账号)
withGithub.png
  • 点击『Authorize bintray-bot』,然后,需要完善其它信息(国内的邮箱貌似都被认为是临时邮箱,最好是 gmail 邮箱):
reg.png
  • 点击『Complete Registration』,然后会自动跳转到主页
complete.png
  • 创建 Maven 仓库(登录后的主界面,点击『Add New Repository』)
cmvn.png
  • 点击『Create』就创建好了 Maven 仓库,如下:
fmvn.png

咱们自己的 Maven 仓库就创建好啦!

4.2、项目中添加配置及相关依赖

4.2.1、添加 JCenter 账号(根目录下的 gradle.properties)

获取 Jcenter 的 Key:点击账号 -> 选择『Edit』-> 点击『API Key』,如下图:

key.png bin-conf.png

4.2.2、根目录 build.gradle 配置

bin-plug.png

4.2.3、修改 publish-java.gradle

pjg.png

4.2.4、上传至 JCenter

当我们做完以上配置后,有两种方式打包并上传至 JCenter 的 Maven(我们前面创建的仓库,但并未真正发布至公共可见)

two-way-upload.png

本例采用命令行上传(用联通、移动开热点上传就快,电信...看运气):

upload-finished.png

上传成功,查看 bintray 的 maven 仓库:

check.png

可以看到已经有了,注意:右上角有个直连URL,我们可以在我们的根build.gradle中配置:

remodify.png

然后再『Sync now』,查看『External Libraries』:

ext-lib.png

已经可以下载了(虽然目前还没有加入到 JCenter 中,但是只要配有该 URL,就能访问下载 jar 包)。

4.2.5 请求加入至 JCenter

addToJcenter.png

填写好理由,点击『send』就行啦!

sendToRequest.png

至此,一个完整的流程就OK啦!

相关文章

网友评论

    本文标题:自定义Gradle Plugin远程发布

    本文链接:https://www.haomeiwen.com/subject/sbcytltx.html