发布Gradle Plugin 到 Artifactory 私有仓库

1,496 阅读4分钟

前言

最近在学习gradle plugin的编写,发布gradle plugin这是很直接的需求,我写这篇文章一是纪录如何学习、二是如何举一反三。

需求

公司会有各种原因让你编写gradle plugin,当编写完gradle plugin后,你的目标一定是推广给你团队的小伙伴,这篇文章主要就是帮助你解决这个问题。
通常你有两种选择:

1、在工程中编译gradle plugin插件到本地,local引用
2、上传gradle plugin到远程仓库,remote引用

示例

现在我们已butterknife为例,它的接入方式如下
To use Butter Knife in a library, add the plugin to your buildscript:

buildscript {
  repositories {
    mavenCentral()
    google()
  }
  dependencies {
    classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
  }
}

and then apply it in your module:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

是不是so easy,通常这也是标准方案。别急,我们先简单分析一下:

classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'

这是什么意思?如果你接触过gradle plugin的编写的话,很容易就看出这是一个gradle plugin,并且已经发布在远程仓库中。它的意思是,这个插件GroupIdcom.jakewhartonArtifactIdbutterknife-gradle-plugin,Version10.2.3发布在远程仓库上。
接着看第二句:

apply plugin: 'com.jakewharton.butterknife' 意思是在module中引入该插件,该插件的入口配置文件是com.jakewharton.butterknife.properties,接着我们从源码工程结构验证:

举一反三

我们看出只需发布gradle plugin 就可以满足要求。接下来问题定位为,只需了解如何发布gradle plugin远程仓库即可。 我的思路是,类比上一篇文章构建你的私有仓库,发布你的库,提高工程构建速度发布aar的方式就行,当我满怀信心的clean->assemble ->publish -> artifactoryPublish ,水到渠成,如下图。

但是当我在app工程中使用的时候,app根目录build.gradle

plugins {
    id 'com.android.application'
    id 'com.donews.gradle.plugin'
}

提示一个错误

Build file 'C:\dev\android\gradle-tools\app\build.gradle' line: 3

Plugin [id: 'com.donews.gradle.plugin'] was not found in any of the following sources:

说明我上传到远程仓库存在问题,即发布aar的方式和发布gradle plugin 有区别

寻找资料学习

那么要正确的发布到远程仓库现在面临查资料,我的方式是搜关键字gradle plugin publish,出来很多文章,其中有一条结果指向官网gradle官网,有一个发布gradle plugin步骤指南,简单来讲以下步骤:

1、注册账号,获取publishKey和publishSecret,配置gradle.properties
2、引入发布插件java-gradle-plugin、maven-publish、com.gradle.plugin-publish
3、配置发布你要发布的插件

代码如下:

plugins {
    id 'java-gradle-plugin'
    id 'maven-publish'
    id 'com.gradle.plugin-publish' version '0.12.0'
}

pluginBundle {
    website = 'http://www.okwyx.com'
    vcsUrl = 'http://www.okwyx.com'
    tags = ['publish']
}

////////////////////////////////////////////////////////////////
def globalGroupId = "com.donews.tools.gradle"
def globalArtifactId = "commonTools"
def globalVersion = "0.0.5"
def globalContextUrl = "http://localhost:8081/artifactory"
def globalRepoKey = "android_gradle_plugins_local"
def globalUserName = "admin"
def globalPassword = "password"
////////////////////////////////////////////////////////////////

group = globalGroupId
version = globalVersion
gradlePlugin {
    plugins {
        greetingsPlugin {
            id = globalGroupId
            displayName = 'Check code Common tools'
            description = 'Check androidStudio project tools'
            implementationClass = 'com.donews.gradle.CommonTools'
        }
    }
}
//发布到官方结束

执行发布代码:

gradlew publishPlugins

发布成功,显示等待审核中

听网上人说审核需要三四天时间,这...等于是没法测试了,显然我不愿意等三四天。那如果使用我之前自建Artifactory 私有仓库呢,理论可行。接下来就是搜索如何发布到gradle pluginArtifactory ,但是基本上石沉大海,到了官网example案例,也基本上没有这部分内容(或者是我没看到)。

再次举一反三

此时唯一的办法是继续借助butterknife的发布,因为它必定也有此类需求,仔细看,它有一行这样的代码

这不就是我之前发布到本地代码的变种吗

//groovy 本地仓库,调试使用
uploadArchives {
        repositories.mavenDeployer {
        repository(url: uri('../repositories'))//存放路径
        pom.groupId = globalGroupId//工程组的标识,一般为公司名称
        pom.artifactId = globalArtifactId//工程的标识,一般为项目名称
        pom.version = globalVersion//版本号
    }
}

那我只需要把url改成本地的私有仓库路径加上登入的账号和密码就行了,实验一下

uploadArchives {
    repositories.mavenDeployer {
        repository(url: "http://localhost:8081/artifactory/android_gradle_plugins_local/"){
            authentication(userName: "$Artifactory账号", password: "$Artifactory密码")
        }
        pom.groupId = globalGroupId//工程组的标识,一般为公司名称
        pom.artifactId = globalArtifactId//工程的标识,一般为项目名称
        pom.version = globalVersion//版本号
    }
}

执行发布代码:

gradlew clean
gradlew gradle_plugin:assemble
gradlew gradle_plugin:uploadArchives

查看本地仓库代码:

发布成功了,接着app工程引入该插件

plugins {
    id 'com.android.application'
    id 'com.donews.gradle.plugin'
}

发布成功,后续就可以友好的编写gradle plugin,发布到Artifactory私服仓库中了,无需等待审核,给小伙伴引入你的私有库,使用起来吧。